Java 请求 getInputStream return 空流
Java request getInputStream return empty stream
我在使用 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());
Part
提供了一个 getInputStream()
方法,所以当你处理零件时,你应该使用它而不是 request.getInputStream();
。
但是...
Part.write() 是一种将上传的项目写入磁盘的便捷方法,因此您只需使用 part.write(SAVE_DIR + part.getSubmittedFileName());
即可,一切都为您处理(请注意 getSubmittedFileName()
仅适用于小服务程序 3.1).
先做 outputstream.flush() 再做 outputstream.close()
我在使用 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());
Part
提供了一个 getInputStream()
方法,所以当你处理零件时,你应该使用它而不是 request.getInputStream();
。
但是...
Part.write() 是一种将上传的项目写入磁盘的便捷方法,因此您只需使用 part.write(SAVE_DIR + part.getSubmittedFileName());
即可,一切都为您处理(请注意 getSubmittedFileName()
仅适用于小服务程序 3.1).
先做 outputstream.flush() 再做 outputstream.close()