示例#1
0
  /**
   * Called by the connector servlet to handle a {@code POST} request. In particular, it handles the
   * {@link Command#FILE_UPLOAD FileUpload} and {@link Command#QUICK_UPLOAD QuickUpload} commands.
   *
   * @param request the current request instance
   * @return the upload response instance associated with this request
   */
  @SuppressWarnings("unchecked")
  UploadResponse doPost(final HttpServletRequest request) {
    Dispatcher.logger.debug("Entering Dispatcher#doPost");

    final Context context = ThreadLocalData.getContext();
    context.logBaseParameters();

    UploadResponse uploadResponse = null;
    // check permissions for user actions
    if (!RequestCycleHandler.isFileUploadEnabled(request)) {
      uploadResponse = UploadResponse.getFileUploadDisabledError();
    } else if (!Command.isValidForPost(context.getCommandStr())) {
      uploadResponse = UploadResponse.getInvalidCommandError();
    } else if (!ResourceType.isValidType(context.getTypeStr())) {
      uploadResponse = UploadResponse.getInvalidResourceTypeError();
    } else if (!UtilsFile.isValidPath(context.getCurrentFolderStr())) {
      uploadResponse = UploadResponse.getInvalidCurrentFolderError();
    } else {

      // call the Connector#fileUpload
      final ResourceType type = context.getDefaultResourceType();
      final FileItemFactory factory = new DiskFileItemFactory();
      final ServletFileUpload upload = new ServletFileUpload(factory);
      try {
        final List<FileItem> items = upload.parseRequest(request);
        // We upload just one file at the same time
        final FileItem uplFile = items.get(0);
        // Some browsers transfer the entire source path not just the
        // filename
        final String fileName = FilenameUtils.getName(uplFile.getName());
        Dispatcher.logger.debug("Parameter NewFile: {}", fileName);
        // check the extension
        if (type.isDeniedExtension(FilenameUtils.getExtension(fileName))) {
          uploadResponse = UploadResponse.getInvalidFileTypeError();
        } else if (type.equals(ResourceType.IMAGE)
            && PropertiesLoader.isSecureImageUploads()
            && !UtilsFile.isImage(uplFile.getInputStream())) {
          uploadResponse = UploadResponse.getInvalidFileTypeError();
        } else {
          final String sanitizedFileName = UtilsFile.sanitizeFileName(fileName);
          Dispatcher.logger.debug("Parameter NewFile (sanitized): {}", sanitizedFileName);
          final String newFileName =
              this.connector.fileUpload(
                  type, context.getCurrentFolderStr(), sanitizedFileName, uplFile.getInputStream());
          final String fileUrl =
              UtilsResponse.fileUrl(
                  RequestCycleHandler.getUserFilesPath(request),
                  type,
                  context.getCurrentFolderStr(),
                  newFileName);

          if (sanitizedFileName.equals(newFileName)) {
            uploadResponse = UploadResponse.getOK(fileUrl);
          } else {
            uploadResponse = UploadResponse.getFileRenamedWarning(fileUrl, newFileName);
            Dispatcher.logger.debug("Parameter NewFile (renamed): {}", newFileName);
          }
        }

        uplFile.delete();
      } catch (final InvalidCurrentFolderException e) {
        uploadResponse = UploadResponse.getInvalidCurrentFolderError();
      } catch (final WriteException e) {
        uploadResponse = UploadResponse.getFileUploadWriteError();
      } catch (final IOException e) {
        uploadResponse = UploadResponse.getFileUploadWriteError();
      } catch (final FileUploadException e) {
        uploadResponse = UploadResponse.getFileUploadWriteError();
      }
    }

    Dispatcher.logger.debug("Exiting Dispatcher#doPost");
    return uploadResponse;
  }