Проблема FileUpload со Struts на сервере - PullRequest
1 голос
/ 11 октября 2010

Я пытаюсь создать сервлет загрузки, который обрабатывает enctype = "multipart / form-data" из формы. Файл, который я пытаюсь загрузить, является почтовым индексом. Тем не менее, я могу загрузить и прочитать файл на локальном хосте, но когда я загружаю на сервер, я получаю ошибку «Файл не найден», когда я хочу загрузить файл. Это из-за структуры Struts, которую я использую? Спасибо за вашу помощь. Вот часть моего кода, я использую FileUpload от http://commons.apache.org/fileupload/using.html

Я перешел на использование ZipInputStream, однако, как мне ссылаться на ZipFile zip без использования локального адреса диска (то есть: C: //zipfile.zip). Zip является нулевым, потому что его не создан. Мне нужно будет разархивировать и прочитать zipentry в памяти, без записи на сервер.

Для загружаемого сервлета: > приватный ZipFile zip; частный читатель CSVReader; boolean isMultipart = ServletFileUpload.isMultipartContent (запрос); если (isMultipart) { DiskFileItemFactory factory = new DiskFileItemFactory ();

        ServletFileUpload upload = new ServletFileUpload(factory);
       List <FileItem> items = upload.parseRequest(request);
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            //Iterating through the uploaded zip file and reading the content
            FileItem item = (FileItem) iter.next();

             ZipInputStream input = new ZipInputStream(item.getInputStream()); 
             ZipEntry entry = null;
             while (( entry= input.getNextEntry()) != null) {
               ZipEntry entry = (ZipEntry) e.nextElement();
               if(entry.getName().toString().equals("file.csv")){
                   //unzip(entry)
               }

               }
            }


  public static void unzip(ZipEntry entry){
        try{
            InputStream inputStream = **zip**.getInputStream(entry);
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            reader = new CSVReader(inputStreamReader);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

<</p>

1 Ответ

0 голосов
/ 11 октября 2010

Здесь

zip = new ZipFile(new File(fileName));

Вы предполагаете, что локальная дисковая файловая система на компьютере сервера уже содержит файл с точно таким же именем, как и на стороне клиента. Это неверное предположение. То, что он работал на localhost, очевидно, потому что и веб-браузер, и веб-сервер «по совпадению» работают на одной и той же машине с одинаковой файловой системой диска.

Кроме того, вы, похоже, используете Internet Explorer в качестве браузера, который неправильно включает полный путь в имя файла, например C:/full/path/to/file.ext. Вы не должны полагаться на эту ошибку браузера. Другие браузеры, такие как Firefox, правильно отправляют только имя файла, например file.ext, что, в свою очередь, привело бы к ошибке с new File(fileName) (которая должна была помочь вам обнаружить вашу ошибку гораздо раньше).

Чтобы устранить эту «проблему», вам нужно получить файл содержимое как InputStream от item.getInputStream():

ZipInputStream input = new ZipInputStream(item.getInputStream());
// ...

Или записать его на диск по item.write(file) и сослаться на ZipFile:

File file = File.createTempFile("temp", ".zip");
item.write(file);
ZipFile zipFile = new ZipFile(file);
// ...

Примечание: не забудьте заранее проверить расширение файла, иначе это может подавиться.

...