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()