根据Tomcat7's documentation,将Connector中的maxPostSize
设置为小于或等于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
,并将文字字段“description”留空,则会回复:
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
填充未填充的字段?
提前致谢。
答案 0 :(得分:4)
文档不太对。 maxPostSize = 0导致限制为零。 -1是无限制的正确值。我很快就会解决这个问题。