Java请求getInputStream返回空流

Java请求getInputStream返回空流,java,post,inputstream,filenames,Java,Post,Inputstream,Filenames,我以前在doPost请求中的getInputStream和设置文件名时遇到问题。它给了我一个文件名正确但文件大小为0kB的空文件。若我将注释设置文件名,那个么我将得到一个非空文件 我的过程:从android应用程序中,我将PDF文件归档到http POST之类的上传服务器。在服务器上,doPost类似于下面的方法 如何设置文件名并获取非空文件 protected void doPost(HttpServletRequest request, HttpServletResponse respons

我以前在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");

}
编辑:

解决方案

//Get the right Part
 final Part filePart = request.getPart("uploadedfile");
 //Writes file to location 
 filePart.write(filePart.getSubmittedFileName());

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

然而


是一种将上传的项目写入磁盘的方便方法,因此您可以使用
part.write(SAVE_DIR+part.getSubmittedFileName())并且它都是为您处理的(请注意,
getSubmittedFileName()
仅适用于Servlet 3.1)。

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

您的
getFileName(部分)是什么
method do?InputStream的内容只能使用一次。我想这是在
request.getParts()中发生的,所以第二次访问流时,流是空的。另请参见注意,从
HttpServletRequest.getInputStream()
返回的流不仅仅是上载的文件。它是整个请求的流,包括所有部分头。要仅访问上载的文件,您需要特定
部分的
getInputStream()
@step的
getInputStream()
,不要将代码粘贴到注释中,它是不可读的。编辑您的原始帖子以包含代码。您有一些如何获取部分的示例吗?如何获取上传文件中的“名称”?@Stepan我的
part.write(SAVE_DIR+part.getSubmittedFileName())的哪一部分不清楚?你已经在你的原始代码中得到了部分,那么你怎么能问我“怎么做”?或者这不是你的代码?我的意思是如何知道我在getPart中使用的名称?@Stepan Well,这取决于你在POST请求中给出的名称(如果有的话)。
//Get the right Part
 final Part filePart = request.getPart("uploadedfile");
 //Writes file to location 
 filePart.write(filePart.getSubmittedFileName());