1. 程式人生 > >實現從oss(阿里雲)伺服器以附件形式下載檔案(含批量下載)

實現從oss(阿里雲)伺服器以附件形式下載檔案(含批量下載)

轉載自:https://blog.csdn.net/sinat_28771747/article/details/53520253

筆者在專案中寫一個從阿里雲伺服器上面以附件形式下載檔案的介面時,遇到了問題,網上搜索無任何相關的解決方案,最後通過通過自己查閱API文件,再結合自己的經驗,實現了下載功能。

      通過查詢oss官方文件,我發現只有一個下載檔案到本地的方法(方法1),但是這個方法下載的檔案只能夠將檔案下載到本地的一個固定的目錄下,即必須要在API提供的方法中寫死下載檔案的下載路徑,而且下載檔案時沒有任何下載提示,所以這個方法不適合直接在專案中使用。​

/**
 * 從阿里雲下載檔案 (下載目錄定死了的,無法更改)
 * @param map
 * @return
 */
 // endpoint以杭州為例,其它region請按實際情況填寫
 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
 // accessKey請登入https://ak-console.aliyun.com/#/檢視
 String accessKeyId = "<yourAccessKeyId>";
 String accessKeySecret = "<yourAccessKeySecret>";
 String bucketName = "<yourBucketName>";
 // 建立OSSClient例項
 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
 // 下載object到檔案  new File("<yourLocalFile>"這個file物件需要給定一個本地目錄,檔案會下載到該目錄中
 ossClient.getObject(new GetObjectRequest(bucketName, "<yourKey>"), new File("<yourLocalFile>"));
 // 關閉client
 ossClient.shutdown();

最後通過API文件發現:

       在“下載板塊”第一個“以流形式”下載檔案的方法中,“ossObject.getObjectContent()”方法可以獲取指定id的檔案並返回一個位元組流,因此可以利用這個特性,自己改造一個方法(方法2):

/**
 * 從阿里雲下載檔案 (以附件形式下載)
 * @param request
 * @param response
 */
@ResponseBody
@RequestMapping(value = "/download", method = RequestMethod.GET)
public void downLoadFile(HttpServletRequest request,HttpServletResponse response){
	try {
		String fileid = request.getParameter("fileid").toString();//從前臺獲取當前下載檔案的id值(每個上傳到阿里雲的檔案都會有一個獨一無二的id值)
		String filename =request.getParameter("filename").toString();//從前臺獲取要下載檔案的檔名
		int i=filename.lastIndexOf("\\");
		filename=filename.substring(i+1);
		String aliyunId = ApplicationPropertyUtils.getContextProperty("ALIYUN_ACCESS_KEY_ID");
		String aliyunSecret = ApplicationPropertyUtils.getContextProperty("ALIYUN_ACCESS_KEY_SECRET");
		String ossEndpoint =  ApplicationPropertyUtils.getContextProperty("ALIYUN_OSS_ENDPOINT");
		OSSClient ossClient  = new OSSClient(ossEndpoint, aliyunId, aliyunSecret);
		//獲取fileid對應的阿里雲上的檔案物件
		OSSObject ossObject = ossClient.getObject(bucketName, fileid);//bucketName需要自己設定
		
		// 讀去Object內容  返回
		BufferedInputStream in=new BufferedInputStream(ossObject.getObjectContent());
		//System.out.println(ossObject.getObjectContent().toString());
		
		BufferedOutputStream out=new BufferedOutputStream(response.getOutputStream());
		//通知瀏覽器以附件形式下載			
		response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(filename,"utf-8"));
		//BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(new File("f:\\a.txt")));
		
		byte[] car=new byte[1024];
		int L=0;
		while((L=in.read(car))!=-1){
			out.write(car, 0,L);
			
		}
		if(out!=null){
			out.flush();
			out.close();
		}
		if(in!=null){
			in.close();
		}
		
		ossClient.shutdown();
		
	} catch (Exception e) {
		e.printStackTrace();
	}
}

上面這段程式碼就實現了使用者自定義檔案下載路徑,併成功下載檔案的方法!

——注意:

在實際使用該方法下載的過程中,可能遇到伺服器不報錯,但就是下載不下來檔案的問題,這樣有可能是前端頁面發出下載請求的方式有誤,必須是GET請求,而且不知道為什麼,不能使用AJAX的get方式訪問改方法,筆者使用的方式是用window.location.href訪問,可能還有其它方式可以訪問,筆者這裡就不在說明了。

——關於批量下載阿里雲上檔案

本博文實現了從阿里雲上下載單個檔案的方法,由於會有人存在從阿里雲上下載多個檔案的需求,由此需求的同學可以結合本篇部落格和我的另一篇部落格

Java中的Zip進行多檔案的儲存

思路是:先從阿里雲上獲取需要下載的所有檔案的檔案流,並通過java的Zip將其壓縮為一個壓縮檔案流,而後直接將壓縮檔案流作為下載檔案的輸入流即可實現多檔案下載。