Esempio n. 1
0
 public int compareTo(FileUpload o) {
   int v;
   v = getName().compareToIgnoreCase(o.getName());
   if (v != 0) {
     return v;
   }
   // TODO should we compare size ?
   return v;
 }
Esempio n. 2
0
 @Override
 public void setContent(InputStream inputStream) throws IOException {
   if (fileUpload instanceof MemoryFileUpload) {
     // change to Disk
     fileUpload =
         new DiskFileUpload(
             fileUpload.getName(),
             fileUpload.getFilename(),
             fileUpload.getContentType(),
             fileUpload.getContentTransferEncoding(),
             fileUpload.getCharset(),
             definedSize);
   }
   fileUpload.setContent(inputStream);
 }
Esempio n. 3
0
 @Override
 public void setContent(File file) throws IOException {
   if (file.length() > limitSize) {
     if (fileUpload instanceof MemoryFileUpload) {
       // change to Disk
       fileUpload =
           new DiskFileUpload(
               fileUpload.getName(),
               fileUpload.getFilename(),
               fileUpload.getContentType(),
               fileUpload.getContentTransferEncoding(),
               fileUpload.getCharset(),
               definedSize);
     }
   }
   fileUpload.setContent(file);
 }
Esempio n. 4
0
 @Override
 public void setContent(ChannelBuffer buffer) throws IOException {
   if (buffer.readableBytes() > limitSize) {
     if (fileUpload instanceof MemoryFileUpload) {
       // change to Disk
       fileUpload =
           new DiskFileUpload(
               fileUpload.getName(),
               fileUpload.getFilename(),
               fileUpload.getContentType(),
               fileUpload.getContentTransferEncoding(),
               fileUpload.getCharset(),
               definedSize);
     }
   }
   fileUpload.setContent(buffer);
 }
Esempio n. 5
0
 @Override
 public void addContent(ChannelBuffer buffer, boolean last) throws IOException {
   if (fileUpload instanceof MemoryFileUpload) {
     if (fileUpload.length() + buffer.readableBytes() > limitSize) {
       DiskFileUpload diskFileUpload =
           new DiskFileUpload(
               fileUpload.getName(),
               fileUpload.getFilename(),
               fileUpload.getContentType(),
               fileUpload.getContentTransferEncoding(),
               fileUpload.getCharset(),
               definedSize);
       if (((MemoryFileUpload) fileUpload).getChannelBuffer() != null) {
         diskFileUpload.addContent(((MemoryFileUpload) fileUpload).getChannelBuffer(), last);
       }
       fileUpload = diskFileUpload;
     }
   }
   fileUpload.addContent(buffer, last);
 }
  @RequestMapping(method = RequestMethod.POST)
  public String onSubmit(FileUpload fileUpload, BindingResult errors, HttpServletRequest request)
      throws Exception {

    if (validator != null) { // validator is null during testing
      validator.validate(fileUpload, errors);

      if (errors.hasErrors()) {
        return "uploadForm";
      }
    }

    // validate a file was entered
    if (fileUpload.getFile().length == 0) {
      Object[] args = new Object[] {getText("uploadForm.file", request.getLocale())};
      errors.rejectValue("file", "errors.required", args, "File");

      return "uploadForm";
    }

    MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
    CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest.getFile("file");

    // the directory to upload to
    String uploadDir =
        getServletContext().getRealPath("/resources") + "/" + request.getRemoteUser() + "/";

    // Create the directory if it doesn't exist
    File dirPath = new File(uploadDir);

    if (!dirPath.exists()) {
      dirPath.mkdirs();
    }

    // retrieve the file data
    InputStream stream = file.getInputStream();

    // write the file to the file specified
    OutputStream bos = new FileOutputStream(uploadDir + file.getOriginalFilename());
    int bytesRead;
    byte[] buffer = new byte[8192];

    while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {
      bos.write(buffer, 0, bytesRead);
    }

    bos.close();

    // close the stream
    stream.close();

    // place the data into the request for retrieval on next page
    request.setAttribute("friendlyName", fileUpload.getName());
    request.setAttribute("fileName", file.getOriginalFilename());
    request.setAttribute("contentType", file.getContentType());
    request.setAttribute("size", file.getSize() + " bytes");
    request.setAttribute(
        "location", dirPath.getAbsolutePath() + Constants.FILE_SEP + file.getOriginalFilename());

    String link = request.getContextPath() + "/resources" + "/" + request.getRemoteUser() + "/";
    request.setAttribute("link", link + file.getOriginalFilename());

    return getSuccessView();
  }
Esempio n. 7
0
 @Override
 public String getName() {
   return fileUpload.getName();
 }
  /**
   * Add the InterfaceHttpData to the Body list
   *
   * @param data
   * @throws NullPointerException for data
   * @throws ErrorDataEncoderException if the encoding is in error or if the finalize were already
   *     done
   */
  public void addBodyHttpData(InterfaceHttpData data) throws ErrorDataEncoderException {
    if (headerFinalized) {
      throw new ErrorDataEncoderException("Cannot add value once finalized");
    }
    if (data == null) {
      throw new NullPointerException("data");
    }
    bodyListDatas.add(data);
    if (!isMultipart) {
      if (data instanceof Attribute) {
        Attribute attribute = (Attribute) data;
        try {
          // name=value& with encoded name and attribute
          String key = encodeAttribute(attribute.getName(), charset);
          String value = encodeAttribute(attribute.getValue(), charset);
          Attribute newattribute = factory.createAttribute(request, key, value);
          multipartHttpDatas.add(newattribute);
          globalBodySize += newattribute.getName().length() + 1 + newattribute.length() + 1;
        } catch (IOException e) {
          throw new ErrorDataEncoderException(e);
        }
      } else if (data instanceof FileUpload) {
        // since not Multipart, only name=filename => Attribute
        FileUpload fileUpload = (FileUpload) data;
        // name=filename& with encoded name and filename
        String key = encodeAttribute(fileUpload.getName(), charset);
        String value = encodeAttribute(fileUpload.getFilename(), charset);
        Attribute newattribute = factory.createAttribute(request, key, value);
        multipartHttpDatas.add(newattribute);
        globalBodySize += newattribute.getName().length() + 1 + newattribute.length() + 1;
      }
      return;
    }
    /*
     * Logic:
     * if not Attribute:
     *      add Data to body list
     *      if (duringMixedMode)
     *          add endmixedmultipart delimiter
     *          currentFileUpload = null
     *          duringMixedMode = false;
     *      add multipart delimiter, multipart body header and Data to multipart list
     *      reset currentFileUpload, duringMixedMode
     * if FileUpload: take care of multiple file for one field => mixed mode
     *      if (duringMixeMode)
     *          if (currentFileUpload.name == data.name)
     *              add mixedmultipart delimiter, mixedmultipart body header and Data to multipart list
     *          else
     *              add endmixedmultipart delimiter, multipart body header and Data to multipart list
     *              currentFileUpload = data
     *              duringMixedMode = false;
     *      else
     *          if (currentFileUpload.name == data.name)
     *              change multipart body header of previous file into multipart list to
     *                      mixedmultipart start, mixedmultipart body header
     *              add mixedmultipart delimiter, mixedmultipart body header and Data to multipart list
     *              duringMixedMode = true
     *          else
     *              add multipart delimiter, multipart body header and Data to multipart list
     *              currentFileUpload = data
     *              duringMixedMode = false;
     * Do not add last delimiter! Could be:
     * if duringmixedmode: endmixedmultipart + endmultipart
     * else only endmultipart
     */
    if (data instanceof Attribute) {
      if (duringMixedMode) {
        InternalAttribute internal = new InternalAttribute();
        internal.addValue("\r\n--" + multipartMixedBoundary + "--");
        multipartHttpDatas.add(internal);
        multipartMixedBoundary = null;
        currentFileUpload = null;
        duringMixedMode = false;
      }
      InternalAttribute internal = new InternalAttribute();
      if (multipartHttpDatas.size() > 0) {
        // previously a data field so CRLF
        internal.addValue("\r\n");
      }
      internal.addValue("--" + multipartDataBoundary + "\r\n");
      // content-disposition: form-data; name="field1"
      Attribute attribute = (Attribute) data;
      internal.addValue(
          HttpPostBodyUtil.CONTENT_DISPOSITION
              + ": "
              + HttpPostBodyUtil.FORM_DATA
              + "; "
              + HttpPostBodyUtil.NAME
              + "=\""
              + encodeAttribute(attribute.getName(), charset)
              + "\"\r\n");
      Charset localcharset = attribute.getCharset();
      if (localcharset != null) {
        // Content-Type: charset=charset
        internal.addValue(
            HttpHeaders.Names.CONTENT_TYPE
                + ": "
                + HttpHeaders.Values.CHARSET
                + "="
                + localcharset
                + "\r\n");
      }
      // CRLF between body header and data
      internal.addValue("\r\n");
      multipartHttpDatas.add(internal);
      multipartHttpDatas.add(data);
      globalBodySize += attribute.length() + internal.size();
    } else if (data instanceof FileUpload) {
      FileUpload fileUpload = (FileUpload) data;
      InternalAttribute internal = new InternalAttribute();
      if (multipartHttpDatas.size() > 0) {
        // previously a data field so CRLF
        internal.addValue("\r\n");
      }
      boolean localMixed = false;
      if (duringMixedMode) {
        if (currentFileUpload != null && currentFileUpload.getName().equals(fileUpload.getName())) {
          // continue a mixed mode

          localMixed = true;
        } else {
          // end a mixed mode

          // add endmixedmultipart delimiter, multipart body header and
          // Data to multipart list
          internal.addValue("--" + multipartMixedBoundary + "--");
          multipartHttpDatas.add(internal);
          multipartMixedBoundary = null;
          // start a new one (could be replaced if mixed start again from here
          internal = new InternalAttribute();
          internal.addValue("\r\n");
          localMixed = false;
          // new currentFileUpload and no more in Mixed mode
          currentFileUpload = fileUpload;
          duringMixedMode = false;
        }
      } else {
        if (currentFileUpload != null && currentFileUpload.getName().equals(fileUpload.getName())) {
          // create a new mixed mode (from previous file)

          // change multipart body header of previous file into multipart list to
          // mixedmultipart start, mixedmultipart body header

          // change Internal (size()-2 position in multipartHttpDatas)
          // from (line starting with *)
          // --AaB03x
          // * Content-Disposition: form-data; name="files"; filename="file1.txt"
          // Content-Type: text/plain
          // to (lines starting with *)
          // --AaB03x
          // * Content-Disposition: form-data; name="files"
          // * Content-Type: multipart/mixed; boundary=BbC04y
          // *
          // * --BbC04y
          // * Content-Disposition: file; filename="file1.txt"
          // Content-Type: text/plain
          initMixedMultipart();
          InternalAttribute pastAttribute =
              (InternalAttribute) multipartHttpDatas.get(multipartHttpDatas.size() - 2);
          // remove past size
          globalBodySize -= pastAttribute.size();
          String replacement =
              HttpPostBodyUtil.CONTENT_DISPOSITION
                  + ": "
                  + HttpPostBodyUtil.FORM_DATA
                  + "; "
                  + HttpPostBodyUtil.NAME
                  + "=\""
                  + encodeAttribute(fileUpload.getName(), charset)
                  + "\"\r\n";
          replacement +=
              HttpHeaders.Names.CONTENT_TYPE
                  + ": "
                  + HttpPostBodyUtil.MULTIPART_MIXED
                  + "; "
                  + HttpHeaders.Values.BOUNDARY
                  + "="
                  + multipartMixedBoundary
                  + "\r\n\r\n";
          replacement += "--" + multipartMixedBoundary + "\r\n";
          replacement +=
              HttpPostBodyUtil.CONTENT_DISPOSITION
                  + ": "
                  + HttpPostBodyUtil.FILE
                  + "; "
                  + HttpPostBodyUtil.FILENAME
                  + "=\""
                  + encodeAttribute(fileUpload.getFilename(), charset)
                  + "\"\r\n";
          pastAttribute.setValue(replacement, 1);
          // update past size
          globalBodySize += pastAttribute.size();

          // now continue
          // add mixedmultipart delimiter, mixedmultipart body header and
          // Data to multipart list
          localMixed = true;
          duringMixedMode = true;
        } else {
          // a simple new multipart
          // add multipart delimiter, multipart body header and Data to multipart list
          localMixed = false;
          currentFileUpload = fileUpload;
          duringMixedMode = false;
        }
      }

      if (localMixed) {
        // add mixedmultipart delimiter, mixedmultipart body header and
        // Data to multipart list
        internal.addValue("--" + multipartMixedBoundary + "\r\n");
        // Content-Disposition: file; filename="file1.txt"
        internal.addValue(
            HttpPostBodyUtil.CONTENT_DISPOSITION
                + ": "
                + HttpPostBodyUtil.FILE
                + "; "
                + HttpPostBodyUtil.FILENAME
                + "=\""
                + encodeAttribute(fileUpload.getFilename(), charset)
                + "\"\r\n");

      } else {
        internal.addValue("--" + multipartDataBoundary + "\r\n");
        // Content-Disposition: form-data; name="files"; filename="file1.txt"
        internal.addValue(
            HttpPostBodyUtil.CONTENT_DISPOSITION
                + ": "
                + HttpPostBodyUtil.FORM_DATA
                + "; "
                + HttpPostBodyUtil.NAME
                + "=\""
                + encodeAttribute(fileUpload.getName(), charset)
                + "\"; "
                + HttpPostBodyUtil.FILENAME
                + "=\""
                + encodeAttribute(fileUpload.getFilename(), charset)
                + "\"\r\n");
      }
      // Content-Type: image/gif
      // Content-Type: text/plain; charset=ISO-8859-1
      // Content-Transfer-Encoding: binary
      internal.addValue(HttpHeaders.Names.CONTENT_TYPE + ": " + fileUpload.getContentType());
      String contentTransferEncoding = fileUpload.getContentTransferEncoding();
      if (contentTransferEncoding != null
          && contentTransferEncoding.equals(
              HttpPostBodyUtil.TransferEncodingMechanism.BINARY.value)) {
        internal.addValue(
            "\r\n"
                + HttpHeaders.Names.CONTENT_TRANSFER_ENCODING
                + ": "
                + HttpPostBodyUtil.TransferEncodingMechanism.BINARY.value
                + "\r\n\r\n");
      } else if (fileUpload.getCharset() != null) {
        internal.addValue(
            "; " + HttpHeaders.Values.CHARSET + "=" + fileUpload.getCharset() + "\r\n\r\n");
      } else {
        internal.addValue("\r\n\r\n");
      }
      multipartHttpDatas.add(internal);
      multipartHttpDatas.add(data);
      globalBodySize += fileUpload.length() + internal.size();
    }
  }