1. 程式人生 > >java 從伺服器下載檔案並儲存到本地

java 從伺服器下載檔案並儲存到本地

最近在做專案,做到檔案的下載,假設公司有檔案伺服器(像ftp或者其他),像開發人員怎麼進行從檔案伺服器上下載檔案到本地指定目錄下!又或者需要從網上下載資源到本地指定的目錄下,這時候最需要關心的幾個問題就是:

(1)客戶端發起一個url請求,獲取連線物件。            (2)伺服器解析url,並且將指定的資源返回一個輸入流給客戶。            (3)建立儲存的目錄以及儲存的檔名。            (4)輸出了寫資料。            (5)關閉輸入流和輸出流。 程式碼實現: 我以struts2為例子,我們可以先建立一個檔案下載工具類,這樣方便呼叫,再在action的類方法裡面去呼叫這個工具類中方法! 一、先是工具類DownLoadUtil.java,程式碼如下:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownLoadUtil {
//downLoadThingName是要從遠端網站或者伺服器上下載檔案的命名
	public static File saveUrlAs(String url, String filePath,String downLoadThingName, String method) {
		// System.out.println("fileName---->"+filePath);
		// 建立不同的資料夾目錄
		File file = new File(filePath);
		// 判斷資料夾是否存在
		if (!file.exists()) {
			// 如果資料夾不存在,則建立新的的資料夾
			file.mkdirs();
		}
		FileOutputStream fileOut = null;
		HttpURLConnection conn = null;
		InputStream inputStream = null;
		try {
			// 建立連結
			URL httpUrl = new URL(url);
			conn = (HttpURLConnection) httpUrl.openConnection();
			// 以Post方式提交表單,預設get方式
			conn.setRequestMethod(method);
			conn.setDoInput(true);
			conn.setDoOutput(true);
			// post方式不能使用快取
			conn.setUseCaches(false);
			// 連線指定的資源
			conn.connect();
			// 獲取網路輸入流
			inputStream = conn.getInputStream();
			BufferedInputStream bis = new BufferedInputStream(inputStream);
			// 判斷檔案的儲存路徑後面是否以/結尾
			if (!filePath.endsWith("/")) {

				filePath += "/";

			}
			// 寫入到檔案(注意檔案儲存路徑的後面一定要加上檔案的名稱)
			fileOut = new FileOutputStream(filePath + downLoadThingName);
			BufferedOutputStream bos = new BufferedOutputStream(fileOut);

			byte[] buf = new byte[4096];
			int length = bis.read(buf);
			// 儲存檔案
			while (length != -1) {
				bos.write(buf, 0, length);
				length = bis.read(buf);
			}
			bos.close();
			bis.close();
			conn.disconnect();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("丟擲異常!!");
		}
		return file;
	}
二、action中的實現方法程式碼:
public String docDown() throws Exception{
	Document document= documentDao.tokeDoc(docId);//這裡是從資料庫查詢出的文件物件,要根據自己情況自行建立
	String docUrl = "http://seopic.699pic.com/photo/50078/6395.jpg_wh1200.jpg";//這裡可以加上自己的檔名稱變數,如:document.getDocumentName()
	//String fileName = docUrl.substring(docUrl.lastIndexOf("/"));這裡會建立6395.jpg_wh1200.jpg資料夾
	String fileName = "downLoad";
	String filePath = "d:/";
	File file = DownLoadUtil.saveUrlAs(docUrl, filePath + fileName,document.getDocumentName(), "GET");
	System.out.println("Run ok!/Get URL file " + file);
	return null;
}
三、struts.xml中的action配置,只需指定method方法為docDown, 其他的result、param不需要!

其中有些程式碼是根據別人改寫而來的!文中有啥不對的地方,歡迎大家指正!