1. 程式人生 > >用post或者get實現檔案下載

用post或者get實現檔案下載

package test;

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;
import java.util.Calendar;

public class filedownload1 {
	/**
	 * @功能 下載臨時素材介面
	 * @param filePath 檔案將要儲存的目錄
	 * @param method 請求方法,包括POST和GET
	 * @param url 請求的路徑
	 * @return
	 */

	public static File saveUrlAs(String url,String filePath,String method){
		 FileOutputStream fileOut = null;
		 HttpURLConnection conn = null;
		 InputStream inputStream = null;
		 File file=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 += "/";

		    	 }
		     String extName = url.substring(url.lastIndexOf("."));
		     java.util.GregorianCalendar gcalendar =  new java.util.GregorianCalendar();
				String year = gcalendar.get(Calendar.YEAR)+"";
				String month = gcalendar.get(Calendar.MONTH)+1 + "";
				String day = gcalendar.get(Calendar.DAY_OF_MONTH)+"";
				String newFileName =new java.util.Date().getTime() + "_" + (int)(1000 *Math.random())+ extName;	
		     String dirPath = year + File.separator +month + File.separator + day + File.separator;
				//寫入到檔案(注意檔案儲存路徑的後面一定要加上檔案的名稱)
		   //建立不同的資料夾目錄
			 file=new File(filePath +dirPath);
			 //判斷資料夾是否存在
			 if (!file.exists())
			{
				//如果資料夾不存在,則建立新的的資料夾
				 file.mkdirs();
			}
	         fileOut = new FileOutputStream(filePath +dirPath +newFileName);
	         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;
		 
	 }
	public static void main(String[] args) {
		String fileUrl = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";                                      
//		String fileUrl  = "file:///D:/test/test1.txt";
		/*
		 * 報錯:java.lang.ClassCastException: sun.net.www.protocol.file.FileURLConnection cannot be cast to java.net.HttpURLConnection
		 */
        String filePath = "d:/test1";    
        File file = saveUrlAs(fileUrl, filePath ,"GET"); 
        /*
         * 若為POST,則報錯:java.io.IOException: Server returned HTTP response code: 405 for URL:https://ss0.bdstatic。。。
         */
        
        System.out.println("Run ok!/n<BR>Get URL file " + file);    

	}

}

注意本方法有較大約束性:

1.此方法只能用GET,不能用POST;

2.只能用http協議下載其他網站的檔案,不能用file協議下載伺服器本地檔案。