java servlet cos multipart:保存输入流以供以后存储

时间:2011-12-07 10:12:50

标签: java jsf multipart cos

我正在使用COS multipart来处理servlet上的文件上传。

在处理部件时,我需要使用额外的发布字段(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 个答案:

答案 0 :(得分:2)

调用readNextPart()会使您从上一部分获得的任何数据无效。

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

这使您可以慷慨地处理许多常见错误:磁盘已满,保存时出错等,因为在100%确定新文件完成之前,您永远不会覆盖现有文件。

答案 1 :(得分:-1)

尝试用这样的单斜杠替换双斜杠..

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