利用struts做上傳和下載文件很簡單,省去了大量的代碼,具體:
下載:
jsp代碼
$("#downinfo").empty();
$("#downinfo").append("生成DOC成功,<a href='idc/report/downloadfilePath="+data.data+"&fileName="+data.filename+"'><span style='color:blue'>下載</span></a>");
struts2配置
<action name="download" class="idcFlowUploadFile" >
<result name="success" type="stream">
<!-- 下載的文件數據存放的方法,該方法返回一個InputStream
例如取值爲inputStream的屬性需要編寫getInputStream()方法-->
<param name="inputName">downloadFile</param>
<!--下載時,客戶端顯示的下載的文件名 -->
<param name="contentDisposition"> attachment; filename=${fileName}</param>
<!-- 數據的緩衝大小 -->
<param name="bufferSize">1024</param>
</result>
</action>
java代碼
//x下載文件
public InputStream getDownloadFile() throws Exception{
String file = filePath;
downloadFile = new FileInputStream(new File(file));
return downloadFile;
}
public void setDownloadFile(InputStream downloadFile) {
this.downloadFile = downloadFile;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) throws UnsupportedEncodingException {
this.filePath = new String(filePath.getBytes("iso8859-1"),"utf-8");
}
遇到的問題:
1.action中沒有method,不知道怎麼調取方法
<!-- 下載的文件數據存放的方法,該方法返回一個InputStream
例如取值爲inputStream的屬性需要編寫getInputStream()方法-->
<param name="inputName">downloadFile</param>
只需要編寫getDownLoadFile方法即可,接收一個流。
2.下載的文件名 修改成動態
<!--下載時,客戶端顯示的下載的文件名 -->
<param name="contentDisposition"> attachment; filename=${fileName}</param>
只需要後臺傳一個fileName即可
3.下載路徑中含有中文,下載失敗
public void setFilePath(String filePath) throws UnsupportedEncodingException {
this.filePath = new String(filePath.getBytes("iso8859-1"),"utf-8");
}
在傳入後臺的路徑中把路徑設置成utf-8即可
4.下載慢
<!-- 數據的緩衝大小 -->
<param name="bufferSize">1024</param>
根據文件大小的需要設置適當的緩衝大小。
5.設置下載的類型
<param name="contentType">${contentType}</param><!-- 下載的內容類型,如圖片類型、文檔類型等…… -->
-
<!--指定文件內容類型和互聯網MIME標準中的規定類型一致,
-
例如text/plain代表純文本,text/xml表示XML,image/gif
-
代表GIF圖片,image/jpeg代表JPG圖片 -->
-
也可以不設置,不限制下載的文件類型
上傳
可以用easyui-filebox
jsp
<tr>
<td> 圖片路徑:</td>
<td><input multiple style="width:300px" id="fileputHB1" name="fileputHB1" class="easyui-filebox" data-options='onChange:change_photo1'>
</td>
</tr>
struts2
<action name="uploads" class="idcFlowUploadFile" method="uploads">
<!-- 指定(限制)上傳文件的類型,定義局部攔截器,修改默認攔截器的屬性
"fileUpload.maximumSize" :限制上傳最大的文件大小。
"fileUpload.allowedTypes":允許上傳文件的類型。
"fileUpload.allowedExtensions":允許上傳文件的可擴展文件類型。 -->
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">500000000</param>
<param name="fileUpload.allowedTypes"> image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png, image/pjpeg </param>
</interceptor-ref>
</action>
java
// 上傳的圖片存儲在本地
public String uploadFileByStrong(File file, String Rname, String dirname)
throws IOException {
if (!file.isFile()) {
return "";
}
String filename = "";
try {
// 創建磁盤文件夾
String path = storagePath+ dirname;
filename = UUID.randomUUID().toString() + "-" + Rname + ".png";
File file1 = new File(path + "/" + filename);
if (!file1.getParentFile().exists()) {
file1.getParentFile().mkdirs();
}
FileInputStream in = new FileInputStream(file);
FileOutputStream out = new FileOutputStream(file1);
int n = 0;// 每次讀取的字節長度
byte[] bb = new byte[1024];// 存儲每次讀取的內容
while ((n = in.read(bb)) != -1) {
out.write(bb, 0, n);// 將讀取的內容,寫入到輸出流當中
}
// 執行完以上後,磁盤下的該文件才完整,大小是實際大小
out.close();// 關閉輸入輸出流
in.close();
return path+"/"+filename;
} catch (Exception e) {
// TODO: handle exception
return "";
}
}