2011-12-07 23 views
0

我正在使用COS multipart处理servlet上的文件上载。java servlet cos multipart:保存inpustream用于以后的存储

在处理部件时,我需要使用额外的发布字段(ParamPart)重命名文件,在这种情况下,'artikelcode'需要预先添加到文件名中。

因此,不需要直接将FilePart写入磁盘,我需要将输入流保存在内存中。

这是我的代码至今:

MultipartParser multipartParser = new MultipartParser(request, 100000000); 
       String artikelcode = null; 
       String filename = null; 
       InputStream in = null; 

       while ((part = multipartParser.readNextPart()) != null) { 
        if (part.isFile()) { 
         FilePart filePart = (FilePart) part; 
         filename = filePart.getFileName(); 
         //long fileSize = filePart.writeTo(new File(fileSavePath)); 
         if (filename != null) in = filePart.getInputStream(); 
        } 

        if (part.isParam()) { 
         ParamPart paramPart = (ParamPart) part; 
         if (paramPart.getName().equals("artikelcode")) artikelcode = paramPart.getStringValue(); 
        } 
       } 

       if (in != null) 
       { 
        String fileSavePath = "c:\\upload\\"+artikelcode+"_"+filename; 
        File file = new File(fileSavePath); 
        OutputStream out = new FileOutputStream(file); 
        IOUtils.copy(in, out); 
        out.close(); 
       } 

当文件被保存在磁盘上,它是空的!

感谢您的帮助!

回答

2

调用readNextPart()无效,你从前面部分有任何数据。

这是一个更好的方法:始终使用临时名称保存该文件,然后重命名它。

这可以让你像处理大量常见错误一样:磁盘已满,保存时发生错误等等,因为在100%确定新文件完成之前,您从不覆盖现有文件。

+0

好吧我遵循你的建议,但重命名不起作用,这是我的代码: File newdest = new File(“c:\\ upload \\”+ artikelcode +“_”+ filename); file.renameTo(newdest); – Sobek

+0

好nvm,我不得不给文件实例一个临时名称,而不是只有目录路径:) – Sobek

-1

尝试更换单斜杠双斜线这样的..

String fileSavePath = "c:/upload/"+artikelcode+"_"+filename; 
+1

斜线无关紧要,作品无论如何,文件保存在磁盘上但没有内容(0字节) – Sobek