2

Tomcat7 のドキュメントによるとmaxPostSize、Connector で以下の値に設定0すると、ポスト リクエストのサイズの制限が無効になる場合があります。しかし、実際には、に設定しても0、multipart/form-data enctype でファイルをアップロードすると、最大サイズ制限を超えるというエラーが発生しました。に設定すると-1、制限は発生しませんが、他の奇妙なことが起こりました。

テキスト入力フィールドを含むファイルをアップロードするための HTML コードは次のとおりです。

<html>
    <head>
    </head>
    <body>
        test
        <form action="UploadFile" method="post" enctype="multipart/form-data">
            <input type="text" name="description" />
            <input type="file" name="file" />
            <input type="submit" />
        </form>
    </body>
</html>

サーバー側のコードは Servlet 3.0 API を使用しています。

import javax.servlet.http.Part;
import javax.servlet.annotation.MultipartConfig;
import java.io.InputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Collection;
import com.google.gson.JsonObject;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;


    @MultipartConfig(fileSizeThreshold=1024*1024*10,    // 10 MB
                     maxFileSize=1024*1024*50,          // 50 MB
                     maxRequestSize=1024*1024*100)      // 100 MB
    public class UploadFile extends HttpServlet
    {
        public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws Exception
        {
            // Retrieves <input type="text" name="description">
            String description = request.getParameter("description"); 

            JsonObject jsonRet = new JsonObject();
            JsonArray jsonArray = new JsonArray();
            jsonRet.add("files", jsonArray);
            try {
                Collection<Part> allParts = request.getParts(); // Retrieves all uploaded files
                for (Part filePart : allParts) {
                    String filename = null;
                    if (filePart == null || filePart.getContentType() == null) {
                        System.out.println("part is null");
                        continue;
                    } else {
                        filename = getFilename(filePart);
                    }
                    System.out.println(filename);
                    InputStream filecontent = filePart.getInputStream();
                    FileOutputStream fos = new FileOutputStream("/tmp/uploadfile/" + filename);
                    byte[] buffer = new byte[1024 * 4];
                    int c = 0;
                    while ((c = filecontent.read(buffer)) != -1) {
                        fos.write(buffer, 0, c);
                    }
                    JsonObject jsonObj = new JsonObject();
                    jsonObj.addProperty("name", filename);
                    jsonObj.addProperty("size", filePart.getSize());
                    jsonObj.addProperty("url", "the-url");
                    jsonObj.addProperty("thumbnail_url", "the-thumb");
                    jsonObj.addProperty("delete_url", "the-delete");
                    jsonObj.addProperty("delete_type", "DELETE");
                    jsonArray.add(jsonObj);
                }

                response.setCharacterEncoding("utf-8");
                response.setContentType("text/plain");
                PrintWriter writer = response.getWriter();
                writer.write(jsonRet.toString());
            } catch (Exception e) {
                throw e;
            }

        }

        private static String getFilename(Part part) 
        {
            for (String cd : part.getHeader("Content-Disposition").split(";")) {
                if (cd.trim().startsWith("filename")) {
                    String filename = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
                    return filename.substring(filename.lastIndexOf('/') + 1).substring(filename.lastIndexOf('\\') + 1); // MSIE fix.
                }
            }
            return null;
        }

に設定maxPostSize-1、テキスト フィールドの「説明」を空白のままにすると、次のように応答します。

java.lang.String.<init>(String.java:481)
    org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.getString(DiskFileItem.java:328)
    org.apache.catalina.connector.Request.parseParts(Request.java:2752)
    org.apache.catalina.connector.Request.parseParameters(Request.java:3083)
    org.apache.catalina.connector.Request.getParameter(Request.java:1151)
    org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:384)
    com.bluepyxis.servlet.HttpServletRequestWrapper.getParameter(HttpServletRequestWrapper.java:40)
    com.bluepyxis.actions.UploadFile.process(UploadFile.java:34)
......

正の値に設定maxPostSizeするか、説明フィールドにテキストを入力すると、すべて正常に機能します。

だから、なぜこれが起こるのだろうか?NullPointerException未入力のフィールドを防止しながら、投稿サイズを無制限に設定する方法はありますか?

前もって感謝します。

4

1 に答える 1