【问题标题】:Upload multiple files in Struts2 with Dropzone.js使用 Dropzone.js 在 Struts2 中上传多个文件
【发布时间】:2014-11-21 08:34:57
【问题描述】:

我正在使用 DropZone.js

我的配置是

Dropzone.options.myAwesomeDropzone = {
                        url: 'UploadImages',
                        previewsContainer: ".dropzone-previews",
                        uploadMultiple: true,
                        parallelUploads: 5,
                        maxFiles: 20,
                        addRemoveLinks: true,
                        init: function() {
                            this.on("success", function(file, response) {
                                $('.dz-progress').hide();
                                console.log(response);
                                console.log(file);
                            });
                        }
                    }
                });

此代码与我的本地主机完美配合。 我正在将文件上传到UploadImages url。 我在该 url 方法中输入了一条运行正常的消息。

我的问题是我没有得到应该使用哪个名称来获取服务器中的内容。 就像我应该在我的服务器端实现中访问的 imageFile 变量、imageName 变量、imageContent 类型的名称。

编辑: DropZone的服务器端实现

Dropzone 不提供处理文件的服务器端实现,但上传文件的方式与简单的文件上传形式相同,如下所示:

<form action="" method="post" enctype="multipart/form-data">
  <input type="file" name="file" />
</form>

我知道它包括

<input type="file" name="file" /> 

自动在表单中 所以我们可以使用file访问它

如果

<input name="file" type="file" multiple />

然后我们可以使用file[] 访问它 在服务器端我试过了

  public class ImageAction extends ActionSupport {
         private List<File> file;
         private List<String> fileContentType;
         private List<String> fileFileName;

         System.out.println("Inside Image upload ");
        System.out.print("\n\n---------------------------------------\n");
        int i = 0;
        for (File f : file) {
            System.out.print("\nFile [" + i + "] ");
            System.out.print(" length: " + f.length());
            System.out.print(" name:" + getFileFileName().get(i));
            System.out.print(" contentType: " + getFileContentType().get(i));

            i++;
        }
        System.out.println("\n---------------------------------------\n");
       }
       //getter setter  
       }

正在打印内图上传。

如何在 Action 类上创建文件的访问字段。

【问题讨论】:

    标签: java jquery jsp struts2 dropzone.js


    【解决方案1】:

    问题

    当你使用时

    <input type="file" name="file" multiple /> 
    

    文件将全部以name="file"发送,例如:

    Content-Disposition: form-data; name="file"; filename="foo.jpg"
    Content-Type: image/jpeg
    ...........
    . ...
    .......
    Content-Disposition: form-data; name="file"; filename="bar.jpg"
    Content-Type: image/jpeg
    ....
    .
    ..
    .......
    

    这是 Struts2 FileUpload Interceptor 期望接收的正确参数,与List&lt;File&gt; 和相关的List&lt;String&gt; 一起用于fileNamecontentType

    当您使用dropzone.js 时,文件名将被更改以处理客户端的多输入,方法是将[] 附加到它:

    paramName:被传输的文件参数的名称。 默认为文件。 注意如果您可以选择uploadMultiple 设置为 true,则 Dropzone 会将 [] 附加到名称。

    例如。

    Content-Disposition: form-data; name="file[0]"; filename="foo.jpg"
    Content-Type: image/jpeg
    ...........
    . ...
    .......
    Content-Disposition: form-data; name="file[1]"; filename="bar.jpg"
    Content-Type: image/jpeg
    ....
    .
    ..
    .......
    

    Struts2 根本不喜欢它。

    解决方案

    不要弄乱自定义拦截器和转换器,只需对您用于 Struts2 项目的 dropzone.js 库进行简单调整:

    1. 将您的dropzone.js 重命名为dropzone-struts2.js
    2. 打开文件搜索"[" + n + "]"(最新版本第866行)
    3. 改变这一行

      return "" + this.options.paramName + (this.options.uploadMultiple ? "[" + n + "]" : "");
      

      到这个

      return "" + this.options.paramName; //+ (this.options.uploadMultiple ? "[" + n + "]" : "");
      

    现在它与 Struts2 兼容,并且可以处理多个上传。

    【讨论】:

    • 在循环内部打印前两个语句,然后显示java.lang.NullPointerException social.action.ImageAction.insertToDir(ImageAction.java:51) for System.out.print(" name:" + getFileFileName().get(i));
    • 它在我的 SSCCE 中工作。您需要确保您没有达到任何上限(dropzone.js 的最大文件大小、文件上传拦截器的最大文件大小、最大请求大小)。请尝试使用一个小文件(一些 Kb),然后使用两个,然后更多,并在此处报告发生的情况。还要确保 js 文件没有被缓存(用 firebug 检查,否则 CTRL+F5)。如果还是有问题,请在这里贴出你的真实代码,struts config,jsp代码。
    • 这个答案对我很有帮助。 :)
    • 更新:现在该行是 1246 并且要修改的代码有点不同:return `${this.options.paramName}${this.options.uploadMultiple ? `[${n}]` : ""}`;
    猜你喜欢
    • 2015-09-13
    • 2019-10-01
    • 2016-12-23
    • 2017-11-14
    • 2020-08-15
    • 2019-10-10
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多