【问题标题】:File upload with ServletFileUpload's parseRequest? [duplicate]使用 ServletFileUpload 的 parseRequest 上传文件? [复制]
【发布时间】:2012-10-14 11:26:37
【问题描述】:

我在我的网络应用程序中上传了我用input type="file" 浏览的文件。问题是我得到 FileItem 列表大小为 0 虽然我可以在

下看到所有上传的文件信息

request -> JakartaMutltiPartRequest -> 文件属性

这是读取文件的java代码

public InputStream parseRequestStreamWithApache(HttpServletRequest request)
  throws FileUploadException, IOException {
  InputStream is = null;
  FileItemFactory factory = new DiskFileItemFactory();
  ServletFileUpload upload = new ServletFileUpload(factory);
  List items = upload.parseRequest(request);
  // here the item size is 0 ,i am not sure why i am not getting my file upload in browser with type="file"
  // but If inspect request in debugger i can see my file realted info in request--->JakartaMutltiPartRequest----->files attribute
  Iterator iter = items.iterator();
  while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();

    if (!item.isFormField()) {
      is = item.getInputStream();
    }
  }

  return is;
}

编辑:

这里是 JSP 部分:

<form NAME="form1" action="customer/customerManager!parseRequestStreamWithApache.action" ENCTYPE="multipart/form-data"   method="post" >
     <TABLE >
         <tr>
              <th>Upload File</th>
                  <td>
                   <input name="fileUploadAttr" id="filePath"  type="file" value="">
                 </td>
                  <td > 
                 <Input type="submit" value ="uploadFile"/>
                  </td>
          </tr>
    </TABLE>
</form>

【问题讨论】:

  • 上传到struts 2 action?

标签: jsp servlets file-upload apache-commons-fileupload


【解决方案1】:

正如我在对同一个问题的评论中所说,您之前发布过,这很可能是因为您之前已经解析过请求。 这些文件是请求正文的一部分,您只能解析一次。

更新:

我通常会以这种方式使用 commons-upload:

if (ServletFileUpload.isMultipartContent(request)) {
    ServletFileUpload fileUpload = new ServletFileUpload();
    FileItemIterator items = fileUpload.getItemIterator(request);
    // iterate items
    while (items.hasNext()) {
        FileItemStream item = items.next();
        if (!item.isFormField()) {
            is = item.openStream();
        }
    }
}

【讨论】:

  • 但是我之前没有解析请求
  • 您能否在调用 parseRequestStreamWithApache() 之前展示其余的 servlet 代码,这些代码对您的 HttpServletRequest 执行任何操作?
  • 我将代码放在我的 webapp 的第一个过滤器中,结果仍然相同。所以看起来这不是问题
  • 我用一些代码更新了我的答案,它有点不同,也许你可以试试看?一直为我工作。
  • 谢谢乌多。你是对的。看起来 struts2 文件上传插件已经在两者之间读取。
【解决方案2】:

您应该检查多部分内容

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

if (isMultipart) {
    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);

    try {
        List items = upload.parseRequest(request);
        Iterator iterator = items.iterator();
        while (iterator.hasNext()) {
            FileItem item = (FileItem) iterator.next();
            if (!item.isFormField()) {
                String fileName = item.getName();

                String root = getServletContext().getRealPath("/");
                File path = new File(root + "/fileuploads");
                if (!path.exists()) {
                    boolean status = path.mkdirs();
                }

                File uploadedFile = new File(path + "/" + fileName);
                item.write(uploadedFile);
            }
        }
    } catch (Exception e) {

【讨论】:

  • isMultipart 内容值为 true
  • @MSach 似乎动作 url 与 struts 过滤器发生冲突。如果您使用的是 struts,为什么不使用它的文件上传功能呢?发布 web.xml 并删除除 servlet 配置之外的所有内容。
【解决方案3】:

您要上传的文件有多大?您可能超过了默认阈值。我认为默认是10K

factory.setSizeThreshold(maxSizeYouWantToHandle);

【讨论】:

  • 阈值设置了数据在内存中保存大小的限制,如果超过阈值(10K默认是正确的),数据将存储在磁盘上。默认在 java.io.tempdir 中。
【解决方案4】:

如果您使用的是 weblogic 12,请检查 patch_wls1211 是否已安装。我遇到了同样的问题,应用 patch_wls1211 后解决了。

【讨论】:

    猜你喜欢
    • 2014-07-20
    • 2021-07-22
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2011-01-10
    • 2011-05-10
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多