2010-10-11 64 views
1

我想創建一個上傳servlet,從窗體處理enctype =「multipart/form-data」。我想上傳的文件是zip文件。但是,我可以上傳並在本地主機上讀取文件,但是當我上傳到服務器時,當我想上傳文件時,出現「文件未找到」錯誤。這是由於我使用的Struts框架嗎?謝謝你的幫助。這裏是我的代碼的一部分,我使用FileUpload從http://commons.apache.org/fileupload/using.html在服務器上的Struts的FileUpload問題

我已經改爲使用ZipInputStream,但是,如何引用ZipFile zip而不使用本地磁盤地址(即:C://zipfile.zip )。由於沒有實例化,zip爲null。我將需要解壓縮並讀取內存中的zipentry,而不寫入服務器。

用於上傳servlet: > 私人ZipFile zip; 私人CSVReader閱讀器; boolean isMultipart = ServletFileUpload.isMultipartContent(request);如果(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)); 

你假設在服務器計算機的本地磁盤文件系統已經包含完全相同的名稱的文件,因爲它是在客戶端側。這是一個錯誤的假設。它在本地主機上工作顯然是因爲「巧合」的web瀏覽器和web服務器都運行在具有相同磁盤文件系統的同一臺計算機上。

此外,您似乎使用Internet Explorer作爲瀏覽器,錯誤地包含文件名中的完整路徑,如C:/full/path/to/file.ext。你不應該依靠這個瀏覽器特定的錯誤。其他瀏覽器如Firefox正確地只發送文件名如file.ext,這反過來會導致與new File(fileName)(它應該幫助你更早地發現你的錯誤)失敗。

要解決這個「問題」,需要通過item.getInputStream()來獲取文件內容InputStream

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 2010-10-12 01:35:20

+0

將其寫入磁盤,然後將'File'作爲ZipFile引用。 – BalusC 2010-10-12 01:54:03

+0

你的意思是ZipFile zip =(ZipFile)item.write(文件)?這個文件會引用到哪裏? – JustToHelp 2010-10-12 02:38:33