2013-11-25 47 views
1

我想開發一個應用程序,用戶將從屏幕上傳文件,該文件將在服務器端進行處理。 我使用Adobe Flex作爲中間件和Java 5的UI,Spring 3.2。我可以成功上傳文件並在服務器端獲得文件名。但是當我試圖獲得InputStream時,我得到FileNotFoundException。它接近它試圖在應用程序服務器內的某個位置創建一個臨時文件,並嘗試讀取該臨時文件進行處理,但未能創建臨時文件。以下是我試圖獲得該文件的代碼片段 -CommonsMultipartFile - FileNotFoundException

public List<TransactionVO> populateVO(VoucherUploadCommandForm object, 
Connection conn) throws XenosException { 
    log.debug("InVoucherVOPopulatorForExcelUpload.populateVO()"); 
    if(object == null){ 
    log.debug(" No file uploaded :("); 
    }else{ 
    CommonsMultipartFile file = object.getFileName(); 
    log.debug(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Excel file uploaded :)"); 
    log.debug("Excel file= "+ file.getOriginalFilename()); 
    try { 
     log.debug("Excel Size= "+ file.getSize()); 
     log.debug("Excel fileItem= "+ file.getFileItem().getInputStream()); 
    } catch (IOException e) { 
     log.error(e); 
    } 
    } 
    return null; 
} 

是錯誤的堆棧跟蹤如下 -

SEVERE: Exception loading sessions from persistent storage 
java.io.FileNotFoundException: C:\apache-tomcat-6.0.20\work\Catalina\localhost\rui-1.1-xenos\upload_375f4172_d416_4ae2_975f_bc5e908a8303_00000007.tmp (The system cannot find the file specified) 
at java.io.FileInputStream.open(Native Method) 
at java.io.FileInputStream.<init>(FileInputStream.java:106) 
at org.apache.commons.fileupload.disk.DiskFileItem.readObject(DiskFileItem.java:663) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:585) 
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:946) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1809) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1908) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1832) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1908) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1832) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348) 
at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1441) 
at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:942) 
at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:394) 
at org.apache.catalina.session.StandardManager.load(StandardManager.java:321) 
at org.apache.catalina.session.StandardManager.start(StandardManager.java:637) 
at org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:438) 
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4358) 
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) 
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) 
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526) 
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:630) 
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:556) 
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:491) 
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206) 
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314) 
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) 
at org.apache.catalina.core.StandardHost.start(StandardHost.java:722) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 
at org.apache.catalina.core.StandardService.start(StandardService.java:516) 
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) 
at org.apache.catalina.startup.Catalina.start(Catalina.java:583) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:585) 
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) 
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 
Nov 25, 2013 2:56:18 PM org.apache.coyote.http11.Http11Protocol start 
INFO: Starting Coyote HTTP/1.1 on http-8084 
Nov 25, 2013 2:56:18 PM org.apache.jk.common.ChannelSocket init 
INFO: JK: ajp13 listening on /0.0.0.0:8009 
Nov 25, 2013 2:56:18 PM org.apache.jk.server.JkMain start 
INFO: Jk running ID=0 time=0/20 config=null 
Nov 25, 2013 2:56:18 PM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 45220 ms 

回答

2

配置您CommonsMultipartResolver用其他的東西,然後默認的目錄。爲此設置CommonsMultipartResolveruploadTempDir屬性。

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
    <property name="uploadTempDir" value="d:/temp" /> 
</bean> 

關於您的代碼的說明,您應該編程爲接口而不是具體的類。在您的控制器中更改CommonsMultipartFileMultipartFile

在您的代碼中,您直接檢索底層的FileItem,因此您應該使用MultipartFile便利方法。您可以在MultipartFile實例上簡單地撥打getInputStream()

public List<TransactionVO> populateVO(VoucherUploadCommandForm object, Connection conn) throws XenosException { 
    log.debug("InVoucherVOPopulatorForExcelUpload.populateVO()"); 
    if(object == null){ 
     log.debug(" No file uploaded :("); 
    }else{ 
     MultipartFile file = object.getFileName(); 
     log.debug(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Excel file uploaded :)"); 
     log.debug("Excel file= "+ file.getOriginalFilename()); 
     try { 
      log.debug("Excel Size= "+ file.getSize()); 
      log.debug("Excel fileItem= "+ file.getInputStream()); 
     } catch (IOException e) { 
      log.error(e); 
     } 
    } 
    return null; 
} 
+0

是的......我只是用CommonsMultipartFile進行測試。一旦完成,我將使用MultipartFile –

+0

它不工作..我在這裏面臨同樣的問題。唯一的區別是現在它使用我指定的路徑。 –

+0

你的tomcat允許寫入給定的目錄嗎?而不是'getInputStream'如果你使用'getBytes',會發生什麼?基本上它很奇怪,因爲首先檢查文件是否存在,例如是否會出現某種破壞文件的惡意軟件掃描程序? –