用struts2上傳和下載文件代碼

利用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 "";
		}
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章