【问题标题】:How to limit uploaded file size in java servlet如何在java servlet中限制上传的文件大小
【发布时间】:2017-01-18 17:06:43
【问题描述】:

我需要使用html type='file' 将图像从客户端上传到服务器,这工作正常,到目前为止,我可以从客户端发送文件并在我的 servlet 上接收,但现在我需要将我的 servlet 中的图像大小限制为2MB,如果大于 2MB,我需要向客户发送关于图像大小的错误信息。

这是我收到的发送图像的 servlet 代码:

public void doPost(HttpServletRequest request, 
      HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();

    MultipartRequest multipartRequest = new MultipartRequest(request, "D:\\");
    out.print("Successfully Uploaded");
}

到目前为止它所做的是接收图像并将其保存在D:目录中,我不想先保存图像然后检查图像大小,而是对MultipartRequest说如果你收到高于2MB发送错误。

提前致谢:)

【问题讨论】:

  • 在客户端检查文件大小不是更合乎逻辑吗?你可以保存一个失败的http请求
  • 否,因为客户端脚本可能会被更改,它会使您的服务器易受攻击

标签: java servlets


【解决方案1】:

由于您没有指定什么是“MultipartRequest”类,我假设您使用的是 oreilly 包。

它有一个public MultipartRequest(HttpServletRequest request, String saveDirectory, int maxPostSize) throws IOException 构造函数,它接受最大文件大小参数。

如果上传的文件大小超过 maxPostSize,会抛出 IOException。您可能会捕获此异常并返回错误响应。

【讨论】:

    【解决方案2】:

    您可以在创建MultipartRequest 实例时限制上传文件的大小。

    • MultipartRequest(javax.servlet.http.HttpServletRequest request, java.lang.String saveDirectory)

    构造一个新的 MultipartRequest 来处理指定的请求,将所有上传的文件保存到给定的目录,并将上传大小限制为 1 兆字节。

    • MultipartRequest(javax.servlet.http.HttpServletRequest request, java.lang.String saveDirectory, int maxPostSize)

    构造一个新的 MultipartRequest 来处理指定的请求,将所有上传的文件保存到给定的目录,并将上传大小限制为指定的长度。

    【讨论】:

      【解决方案3】:

      在 servlet 上使用此代码并立即尝试

        private boolean isMultipart;
         private String filePath;
         private int maxFileSize = 50 * 1024;
         private int maxMemSize = 4 * 1024;
         private File file ; `
      
      DiskFileItemFactory factory = new DiskFileItemFactory();
      
      
            // maximum size that will be stored in memory
            factory.setSizeThreshold(maxMemSize);
      
            // Location to save data that is larger than maxMemSize.
            factory.setRepository(new File("c:\\temp"));
      
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
      
            // maximum file size to be uploaded.
            upload.setSizeMax( maxFileSize );
      
            try { 
               // Parse the request to get file items.
               List fileItems = upload.parseRequest(request);
      
               // Process the uploaded file items
               Iterator i = fileItems.iterator();
      
               out.println("<html>");
               out.println("<head>");
               out.println("<title>Servlet upload</title>");  
               out.println("</head>");
               out.println("<body>");
      
               while ( i.hasNext () ) {
                  FileItem fi = (FileItem)i.next();
                  if ( !fi.isFormField () ) {
                     // Get the uploaded file parameters
                     String fieldName = fi.getFieldName();
                     String fileName = fi.getName();
                     String contentType = fi.getContentType();
                     boolean isInMemory = fi.isInMemory();
                     long sizeInBytes = fi.getSize();
      
                     // Write the file
                     if( fileName.lastIndexOf("\\") >= 0 ) {
                        file = new File( filePath + fileName.substring( fileName.lastIndexOf("\\"))) ;
                     } else {
                        file = new File( filePath + fileName.substring(fileName.lastIndexOf("\\")+1)) ;
                     }
                     fi.write( file ) ;
                     out.println("Uploaded Filename: " + fileName + "<br>");
                  }
               }
               out.println("</body>");
               out.println("</html>");
               } catch(Exception ex) {
                  System.out.println(ex);
               }
      

      文件大小以字节形式表示,因此您可以根据您的要求将最大文件大小添加到 mb,谢谢

      【讨论】:

      • size 属性指定&lt;input&gt; 元素的可见宽度,以字符为单位。” (docs) 它与文件大小无关。此属性甚至不适用于type=file。最后,应该在服务器端验证文件大小。
      • 所以你试试这个构造函数 `nee MultipartRequest (request , uploade_directory , file size in byte ) 所以它在 servlet 上工作但是下载 jar 文件 cos.jar
      猜你喜欢
      • 2023-04-06
      • 2010-09-14
      • 2011-12-05
      • 2012-11-02
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      相关资源
      最近更新 更多