【发布时间】:2015-10-02 09:00:30
【问题描述】:
我之前遇到了来自 doPost 请求和设置文件名的 getInputStream 问题。它给了我一个文件名正确但文件为 0kB 的空文件。如果我评论设置文件名而不是我得到的不是空文件。
我的流程:我正在从 android 应用程序将 PDF 文件归档到上传服务器,例如 http POST。在服务器 doPost 就像下面的方法。
如何设置文件名并获取非空文件?
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String fileName = null;
//Get all the parts from request and write it to the file on server
//getFileName return filename
for (Part part : request.getParts()) {
fileName = getFileName(part);
}
File saveFile = new File(SAVE_DIR + fileName);
// opens input stream of the request for reading data
InputStream inputStream = request.getInputStream();
// opens an output stream for writing file
FileOutputStream outputStream = new FileOutputStream(saveFile);
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.close();
inputStream.close();
// sends response to client
response.getWriter().print("UPLOAD DONE");
}
编辑:
private String getFileName(Part part) {
String contentDisp = part.getHeader("content-disposition");
System.out.println("content-disposition header= " + contentDisp);
String[] tokens = contentDisp.split(";");
for (String token : tokens) {
if (token.trim().startsWith("filename")) {
return token.substring(token.indexOf("=") + 2, token.length() - 1);
}
}
return "";
}
解决方案:
//Get the right Part
final Part filePart = request.getPart("uploadedfile");
//Writes file to location
filePart.write(filePart.getSubmittedFileName());
【问题讨论】:
-
你的
getFileName(part);方法是做什么的? -
InputStream的内容只能消费一次。我猜这发生在request.getParts(),所以第二次访问它时流是空的。另见stackoverflow.com/questions/8522568/… -
注意
HttpServletRequest.getInputStream()返回的流不仅仅是上传的文件。它是整个请求的流,包括所有部分标头。要仅访问上传的文件,您需要特定Part的getInputStream()。 -
@Stepan 不要在 cmets 中粘贴代码,它不可读。编辑您的原始帖子以包含代码。
标签: java post inputstream filenames