Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package org.apache.sling.servlets.post.impl.helper;
 
 
 import javax.jcr.Node;
 
 import  org.apache.sling.api.request.RequestParameter;
 import  org.apache.sling.api.servlets.HtmlResponse;

Handles file uploads.

Simple example:

<form action="/home/admin" method="POST" enctype="multipart/form-data"> <input type="file" name="./portrait" /> </form> this will create a nt:file node below "/home/admin" if the node type of "admin" is (derived from) nt:folder, a nt:resource node otherwise.

Filename example:

<form action="/home/admin" method="POST" enctype="multipart/form-data"> <input type="file" name="./*" /> </form> same as above, but uses the filename of the uploaded file as name for the new node.

Type hint example:

<form action="/home/admin" method="POST" enctype="multipart/form-data"> <input type="file" name="./portrait" /> <input type="hidden" name="./portrait@TypeHint" value="my:file" /> </form> this will create a new node with the type my:file below admin. if the hinted type extends from nt:file an intermediate file node is created otherwise directly a resource node.

 
 public class SlingFileUploadHandler {
 
     // nodetype name string constants
     public static final String NT_FOLDER = "nt:folder";
     public static final String NT_FILE = "nt:file";
     public static final String NT_RESOURCE = "nt:resource";
     public static final String NT_UNSTRUCTURED = "nt:unstructured";
 
     // item name string constants
     public static final String JCR_CONTENT = "jcr:content";
     public static final String JCR_LASTMODIFIED = "jcr:lastModified";
     public static final String JCR_MIMETYPE = "jcr:mimeType";
     public static final String JCR_ENCODING = "jcr:encoding";
     public static final String JCR_DATA = "jcr:data";

    
The servlet context.
 
     private final ServletContext servletContext;

    
Constructs file upload handler

Parameters:
servletCtx the post processor
 
     public SlingFileUploadHandler(ServletContext servletCtx) {
         this.servletContext = servletCtx;
     }

    
Uses the file(s) in the request parameter for creation of new nodes. if the parent node is a nt:folder a new nt:file is created. otherwise just a nt:resource. if the name is '*', the filename of the uploaded file is used.

Parameters:
parent the parent node
prop the assembled property info
Throws:
RepositoryException if an error occurs
    public void setFile(Node parentRequestProperty prop, HtmlResponse response)
            throws RepositoryException {
        RequestParameter value = prop.getValues()[0];
        assert !value.isFormField();
        // ignore if empty
        if (value.getSize() <= 0) {
            return;
        }
        // get node name
        String name = prop.getName();
        if (name.equals("*")) {
            name = value.getFileName();
            // strip of possible path (some browsers include the entire path)
            name = name.substring(name.lastIndexOf('/') + 1);
            name = name.substring(name.lastIndexOf('\\') + 1);
        }
        name = Text.escapeIllegalJcrChars(name);
        // check type hint. if the type is ok and extends from nt:file,
        // create an nt:file with that type. if it's invalid, drop it and let
        // the parent node type decide.
        boolean createNtFile = parent.isNodeType(NT_FOLDER);
        String typeHint = prop.getTypeHint();
        if (typeHint != null) {
            try {
                NodeTypeManager ntMgr = parent.getSession().getWorkspace().getNodeTypeManager();
                NodeType nt = ntMgr.getNodeType(typeHint);
                createNtFile = nt.isNodeType(NT_FILE);
            } catch (RepositoryException e) {
                // assuming type not valid.
                typeHint = null;
            }
        }
        // also create an nt:file if the name contains an extension
        // the rationale is that if the file name is "important" we want
        // an nt:file, and an image name with an extension is probably "important"
        if(!createNtFile && name.indexOf('.') > 0) {
            createNtFile = true;
        }
        // set empty type
        if (typeHint == null) {
            typeHint = createNtFile ? NT_FILE : NT_RESOURCE;
        }
        // remove node
        if (parent.hasNode(name)) {
            parent.getNode(name).remove();
        }
        // create nt:file node if needed
        if (createNtFile) {
            // create nt:file
            parent = parent.addNode(name, typeHint);
            response.onCreated(parent.getPath());
            name = JCR_CONTENT;
            typeHint = NT_RESOURCE;
        }
        // create resource node
        Node res = parent.addNode(name, typeHint);
        response.onCreated(res.getPath());
        // get content type
        String contentType = value.getContentType();
        if (contentType != null) {
            int idx = contentType.indexOf(';');
            if (idx > 0) {
                contentType = contentType.substring(0, idx);
            }
        }
        if (contentType == null || contentType.equals("application/octet-stream")) {
            // try to find a better content type
            contentType = this.servletContext.getMimeType(value.getFileName());
            if (contentType == null || contentType.equals("application/octet-stream")) {
                contentType = "application/octet-stream";
            }
        }
        // set properties
        response.onModified(
            res.setProperty(JCR_LASTMODIFIED, Calendar.getInstance()).getPath()
        );
        response.onModified(
            res.setProperty(JCR_MIMETYPE, contentType).getPath()
        );
        try {
            response.onModified(
                res.setProperty(JCR_DATA, value.getInputStream()).getPath()
            );
        } catch (IOException e) {
            throw new RepositoryException("Error while retrieving inputstream from parameter value.", e);
        }
    }
New to GrepCode? Check out our FAQ X