gpt4 book ai didi

http - Apache commons fileupload 仅在 Firefox 中超时

转载 作者:可可西里 更新时间:2023-11-01 15:12:16 28 4
gpt4 key购买 nike

我在我的 java 项目中使用 Apache commons fileupload 1.4 库。我有一个带有文件输入和一些隐藏字段的经典表单的 html 部分。

我在使用 Firefox >= 52 上传大约 >500ko 的文件时遇到问题

它适用于 Chrome 或 Internet Explorer 中的 10mo 文件。但是对于 Firefox,我在提交表单后等待几分钟后超时。

经过一些调试,我看到导致超时的代码是:

List<FileItem> items = (new ServletFileUpload(new DiskFileItemFactory())).parseRequest(request);

导致等待的部分是“parseRequest”。

我尝试在 IntelliJ 中使用调试器调试请求的内容,但是无法以原始格式复制此请求对象的整个内容值。

它在这些情况下有效:- Firefox : version <= 52 or file size < 500ko (around, it's not really precise)- IE浏览器- Chrome

没有文件大小限制,好像是看请求大小,因为解析请求部分太花时间了...

我在两种情况下收到带有 Firefox 扩展的 HTTP 请求。一个生成上传 3mo 的文件不起作用(请求文件很大,是上传文件大小的 3 倍): https://code.empreintesduweb.com/13561.html

一个生成上传一个 200ko 的文件,这个文件有效(请求文件很小): https://code.empreintesduweb.com/13560.html

事实上,主要区别在于在 Chrome 或 IE 中,我在请求 header 中没有上传文件的原始内容:

部分:对象溪流....尾流内对象

仅在 Firefox 中出现...

最佳答案

您可以尝试设置最大文件大小,可能文件大小超过了最大阈值。根据documentation :

  • Uploaded items should be retained in memory as long as they are reasonably small.
  • Larger items should be written to a temporary file on disk.
  • Very large upload requests should not be permitted.
  • The built-in defaults for the maximum size of an item to be retained in memory, the maximum permitted size of an upload request, and the location of temporary files are acceptable.

尝试以下操作:

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// Set factory constraints
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(yourMaxMemorySize);
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
List<FileItem> items = new ServletFileUpload(factory).parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
// Process regular form field (input type="text|radio|checkbox|etc", select, etc).
String fieldName = item.getFieldName();
String fieldValue = item.getString();
// ... (do your job here)
} else {
// Process form file field (input type="file").
String fieldName = item.getFieldName();
String fileName = FilenameUtils.getName(item.getName());
InputStream fileContent = item.getInputStream();
// ... (do your job here)
}
}
} catch (FileUploadException e) {
throw new ServletException("Cannot parse multipart request.", e);
}

// ...
}

在这里,我们为文件提供了一个临时位置,因为文件很大。

关于http - Apache commons fileupload 仅在 Firefox 中超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56077044/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com