2010-10-11 3 views
1

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

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

Для сервлета загрузки: > private ZipFile zip; частный считыватель CSVReader; boolean isMultipart = ServletFileUpload.isMultipartContent (запрос); if (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(); 
     } 
    } 

<

ответ

0

Здесь

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

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

Кроме того, вы используете 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); 
// ... 

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

+0

спасибо за ваш ответ, но я застрял в ссылке на ZipFile zip. Я не могу заставить его работать без ссылки на фактический файл, который не будет работать на самом сервере. Я редактировал коды выше. – JustToHelp

+0

Запишите его на диск, а затем обратитесь к 'File' как' ZipFile'. – BalusC

+0

Вы имеете в виду ZipFile zip = (ZipFile) item.write (файл)? Этот файл будет ссылаться на где? – JustToHelp

Смежные вопросы