【问题标题】:Java request getInputStream return empty streamJava 请求 getInputStream 返回空流
【发布时间】: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()返回的流不仅仅是上传的文件。它是整个请求的流,包括所有部分标头。要仅访问上传的文件,您需要特定 PartgetInputStream()
  • @Stepan 不要在 cmets 中粘贴代码,它不可读。编辑您的原始帖子以包含代码。

标签: java post inputstream filenames


【解决方案1】:

Part 提供了一个getInputStream() 方法,因此在处理零件时应该使用它而不是request.getInputStream();

不过……

Part.write() 是一种将上传的项目写入磁盘的便捷方法,因此您只需使用 part.write(SAVE_DIR + part.getSubmittedFileName()); 即可为您处理一切(请注意,getSubmittedFileName() 仅适用于 Servlet 3.1)。

【讨论】:

  • 你有一些如何获取零件的例子吗?如何获取上传文件中的“名称”?
  • @Stepan 我的part.write(SAVE_DIR + part.getSubmittedFileName()); 的哪一部分不清楚?你已经在你的原始代码中得到了这些部分,所以你怎么能问我“怎么做”?或者那不是你的代码?
  • 我的意思是我怎么知道我在 getPart 中使用了哪个名字?
  • @Stepan 这取决于您在 POST 请求中提供的名称(如果有)。
【解决方案2】:

在执行 outputstream.close() 之前执行 outputstream.flush()

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 2011-11-20
    • 2023-04-02
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多