1. 程式人生 > >struts2檔案上傳後找不到檔案 與 檔案下載的問題

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

,uploadFileName);加粗改成自己定義的路徑;

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()。