сервлет java, потому что multipart: сохранить inpustream для последующего хранения - PullRequest
0 голосов
/ 07 декабря 2011

Я использую COS multipart для обработки загрузки файла на сервлете.

При обработке деталей мне нужно переименовать файл с дополнительным полем (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 ]

2 голосов
/ 07 декабря 2011

Вызов readNextPart() делает недействительными любые данные, которые вы получили из предыдущей части.

Вот лучший подход: всегда сохраняйте файл с временным именем и затем переименовывайте его.

Этопозволяет обрабатывать множество распространенных ошибок, таких как: переполнение диска, ошибки при сохранении и т. д., поскольку вы никогда не перезаписываете существующие файлы, пока не убедитесь на 100%, что новый файл завершен.

0 голосов
/ 07 декабря 2011

Попробуйте заменить двойной слеш одинарным слешем, как это ..

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