当前位置: 首页 > 知识库问答 >
问题:

Apache公共文件上传超时仅适用于Firefox

戚学
2023-03-14

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

我在上传周围的文件时遇到问题

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

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

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

原因等待的部分是“解析请求”。

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

它在以下情况下工作:-Firefox:版本

没有文件大小限制,似乎取决于请求大小,因为解析请求部分花费了太多时间…

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

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

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

带有:obj流的部分....endstream endobj

仅与Firefox一起出现…

共有3个答案

冀永寿
2023-03-14

尝试使用setMaxInactiveInterval方法设置会话超时

 request.getSession().setMaxInactiveInterval(1200);

参数 指定在 Servlet 容器使此会话失效之前的客户端请求之间的时间(以秒为单位)。间隔值为零或更小表示这些值永远不应超时。

曾飞雨
2023-03-14

在这里值得尝试的一些方法:

    < li >明确编码:https://stackoverflow.com/a/10488411/4279120 < li >分解您的调用并添加迭代,然后尝试catch,例如。:https://www.programcreek.com/java-api-examples/?API = org . Apache . commons . file upload . fileitemiterator < li >看一下< code>MultipartConfig,它似乎提供了诸如< code>maxFileSize和< code>maxRequestSize之类的属性(请参见:https://www . code Java . net/Java-ee/servlet/Java-file-upload-example-with-servlet-30-API # max filesize()) < li >如果可以,请手动定义您的请求的标题。似乎添加“X-File-Name”和“X-File-Size”也有帮助,但这有点老:使用XMLHttpRequest上传AJAX文件

如果您提供更多信息,例如apache/java/servlet的版本,以及更多代码(尤其是Request的定义),我们也可能会更好地帮助您

一些可能有帮助的资源:< br > XMLHttpRequest < br > Sending _ files _ using _ a _ FormData _ object < br >如何设置HTTP GET请求的头,并触发文件下载?

淳于坚壁
2023-03-14

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

  • 上传的项目应保留在内存中,只要它们相当小
  • 较大的项目应写入磁盘上的临时文件
  • 不应允许非常大的上传请求
  • 内存中要保留的项的最大大小、上载请求的最大允许大小和临时文件的位置的内置默认值是可以接受的

尝试以下方法:

 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);
        }

        // ...
    }

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

 类似资料:
  • 我必须文件上传操作连续,第一个图像像gif|jpg|jpeg|png|svg和第二个psd|rar|zip|doc|word|txt|xlsx|pdf第一个工作正常,我可以上传所有图像,但第二个,我不能上传任何这些类型但当我尝试上传图像在第二段它的作品。

  • 看来我有bug了。至少我认为这是一个错误。我编写了一种Soundboard并想添加与他人共享声音的功能。我要分享的代码如下: 我的问题是,这是可行的,但只适用于一些应用程序。例如,当我与WhatsApp或DropBox共享音频时,它似乎工作得很好,但当我尝试使用Google Drive或Bluetooth进行相同操作时,似乎出现了一些错误。请注意,音频的文件类型为WAV。我还确保我有权限写入外部存

  • 我将nginx设置为一种静态文件服务器。出于某种原因,只有当我去123.123.123.123/或123.123.123.123时,它才会起作用。然而,当我去123.123.123.123/static/content/或123.123.123.123/static/content/another.mp3它返回404未找到。下面是位于中并链接到的配置文件。我真的很困惑为什么它不起作用。 如有任何指

  • 问题内容: 我有一个800KB的JPG文件。我尝试上传到S3,并不断收到超时错误。你能弄清楚哪里出了问题吗?800KB很小,无法上传。 错误消息:在超时期限内未读取或写入到服务器的套接字连接。空闲连接将关闭。 HTTP状态码:400 AWS错误代码:RequestTimeout 问题答案: IOUtils.toByteArray是否有可能正在耗尽您的输入流,以便在进行服务调用时不再需要从中读取任何

  • 文件关联是 Navicat 使用什么来打开 Navicat 的已保存文件。例如:.ndtfmysql 文件(MySQL 数据传输配置文件)会以数据传输窗口来打开,而 .nimpmysql 文件(MySQL 导入向导配置文件)会默认以导入向导来打开。

  • 我使用firebase-admin和firebase-functions在Firebase存储中上传文件。 我在仓库里有这样的规则: