struts2檔案上傳後找不到檔案 與 檔案下載的問題
最近做一個關於檔案上傳下載的專案的時候,碰到幾個問題:
1.檔案上傳時<s:file name="upload" label="上傳論文" ></s:file>,此name屬性要有三個對應Action屬性
private File upload;
private String uploadFileName;
private String uploadContentType;
2.檔案上傳的存放路徑,如果只是自己做測試,不用放到磁碟上,用
String realPath = ServletActionContext.getServletContext().getRealPath("/upload");
獲得專案的相對路徑,放在了Tomcat伺服器上,在webapp下的相應釋出專案裡面,每次重啟伺服器上傳的檔案都會消失,
是重新發布了。
if(!saveDir.exists()) {
File saveFile = new File(saveDir,uploadFileName);
try {
FileUtils.copyFile(upload, saveFile);
} catch (IOException e) {
System.out.println("檔案上傳出錯!!");
e.printStackTrace();
return "error";
}
}
如果是要執行專案的話建議存在磁碟上將這裡File saveFile = new File(saveDir
3.檔案下載的時候,就像上面說的,如果你重新發布了,那麼你想要下載你在上次釋出時上傳的檔案的話肯定不會成功的,
檔名中文的話要做處理,如果不作處理可能會碰到這樣的問題:
java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [imageStream] in the invocation stack.
Check the <param name="inputName"> tag specified for this action
我碰到這個問題的時候一開始以為是Check the <param name="inputName"> tag specified for this action這裡的問題
但是在網上查到,是因為inputStream返回為null才引起的這個錯誤,我將檔案路徑和檔名打印出來以後看到是因為檔名為亂碼
然後就是改正亂碼了,開始我這樣改的:
public String getDownloadFileName() {
String downFileName = fileName;
try {
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
System.out.println("檔名出錯");
e.printStackTrace();
}
return downFileName;
}
但是還是不對,又在配置檔案中加入
action name="download" class="net.zjl.action.DownloadFileAction">
<result type="stream">
<param name="contentType">application/octet-stream;charset=ISO8859-1</param>
<param name="inputName">inputStream</param>
<param name="bufferSize">4096</param>
<param name="contentDisposition">attachment;fileName="${downloadFileName}"</param>
</result>
</action>中的粗體字符集,可還是不好使,
最後就做很多嘗試,終於解決,方法如下:
public void setFileName(String fileName) {
try {
this.fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在檔名的setter方法裡面有轉換一下編碼然後就好使了;總之碰到的也就是亂碼問題;
在配置檔案中還要
4. 最頭疼的是在我寫完下載Action以後,覺得沒什麼問題,但是就是報錯NO defined Action XXX and result success )not aviable,
反覆檢查配置檔案有沒有寫錯,但真的就沒有錯,一氣之下刪掉重寫,驚奇的發現竟然好使了,真是愁人啊,和我另一篇getHibernateTemplate()為null
時一樣哪裡都沒寫錯,就是不能正常從Spring配置檔案中獲取getHibernateTemplate()。