首頁 > 軟體

Java 如何獲取url地址檔案流

2022-07-12 14:01:52

獲取url地址檔案流

/**
 * 根據url下載檔案流
 * @param urlStr
 * @return
 */
public static InputStream getInputStreamFromUrl(String urlStr) {
    InputStream inputStream=null;
    try {
        //url解碼
        URL url = new URL(java.net.URLDecoder.decode(urlStr, "UTF-8"));
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //設定超時間為3秒
        conn.setConnectTimeout(3 * 1000);
        //防止遮蔽程式抓取而返回403錯誤
        conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
        //得到輸入流
        inputStream = conn.getInputStream();
    } catch (IOException e) {
        
    }
    return inputStream;
}

根據url獲取檔案的二進位制

當需要獲取url的檔案,又不想下載檔案的時候,可以用這個工具類。

方便快捷,使用HttpURLConnection,先根據URL獲取檔案流,然後把獲取的二進位制流儲存進去資料庫即可,到時候拿出來直接下載、開啟也是OK的。

上程式碼

package jd_test;
import java.io.BufferedReader; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL;
import java.util.Base64;
import java.util.Random;
import java.util.stream.Stream;
 
public class UrlResource { 
	 private static Base64.Decoder decoder = Base64.getDecoder();
	 private static Base64.Encoder encoder = Base64.getEncoder();
	public static void main(String[] args){ 
		try { 
			//System.out.println(UrlResource.getUrlDetail("http://www.baidu.com",true)); 
			//saveUrlFile("你的檔案的路徑.gif", "D:\1.gif");
			
			System.out.println(encoder.encode(getUrlFileData("http://www.你的檔案的路徑")));
		  // System.out.println(getUrlFileData("http://www.你的檔案的路徑"));
		   // saveUrlFile("http://www.你的檔案的路徑", "D:\1.pdf");
		  //  System.out.println(UrlResource.getUrlDetail("http://www.你的檔案的路徑",true)); 
		
			//確定寫出檔案的位置
			File file = new File("D:\1.pdf");
			//建立輸出位元組流
			FileOutputStream fos = new FileOutputStream(file);
			
			//fos.write(decoder.decode(encoder.encode(getUrlFileData("http://www.你的檔案的路徑"))));
			//fos.write(encoder.encode(getUrlFileData("http://www.你的檔案的路徑")));
			fos.write(getUrlFileData("http://www.你的檔案的路徑"));
			
			//用FileOutputStream 的write方法寫入位元組陣列
			//fos.write(getUrlFileData("http://www.你的檔案的路徑"));
			System.out.println("寫入成功");
			//為了節省IO流的開銷,需要關閉
			fos.close();
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
	} 
	
	//獲取網路檔案,轉存到fileDes中,fileDes需要帶檔案字尾名 
	public static void saveUrlFile(String fileUrl,String fileDes) throws Exception 
	{ 
		File toFile = new File(fileDes); 
		if (toFile.exists()) 
		{ 
		// throw new Exception("file exist"); 
		return; 
		} 
		toFile.createNewFile(); 
		FileOutputStream outImgStream = new FileOutputStream(toFile);
		System.out.println(getUrlFileData(fileUrl));
		outImgStream.write(getUrlFileData(fileUrl)); 
		
		outImgStream.close(); 
	} 
	
	public static byte[] getBase64UrlFileData(String fileUrl)
	{
		try {
			
			//發票PDF檔案二進位制流base64,如果是get請求還需要進行UrlEncode,使用sdk除外。 
			return encoder.encode(getUrlFileData(new String(decoder.decode(fileUrl))));
		} catch (Exception e) {
			e.printStackTrace();
		}
			return null;
		}
	//獲取連結地址檔案的byte資料 
	public static byte[] getUrlFileData(String fileUrl) throws Exception 
	{ 
		URL url = new URL(fileUrl); 
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); 
		httpConn.connect(); 
		InputStream cin = httpConn.getInputStream(); 
		ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
		byte[] buffer = new byte[1024]; 
		int len = 0; 
		while ((len = cin.read(buffer)) != -1) { 
		outStream.write(buffer, 0, len); 
		} 
		cin.close(); 
		byte[] fileData = outStream.toByteArray(); 
		outStream.close(); 
		return fileData; 
	} 
	
	//獲取連結地址的字元資料,wichSep是否換行標記 
	public static String getUrlDetail(String urlStr,boolean withSep) throws Exception 
	{ 
	URL url = new URL(urlStr); 
	HttpURLConnection httpConn = (HttpURLConnection)url.openConnection(); 
	httpConn.connect(); 
	InputStream cin = httpConn.getInputStream(); 
	BufferedReader reader = new BufferedReader(new InputStreamReader(cin,"UTF-8")); 
	StringBuffer sb = new StringBuffer(); 
	String rl = null; 
	while((rl = reader.readLine()) != null) 
	{ 
		if (withSep) 
		{ 
			sb.append(rl).append(System.getProperty("line.separator")); 
		}
		//如果是要直接顯示到頁面中,可以講獲得的byte資料進行base64加密,加上檔案頭,直接設定到img的src裡面就可以了
		else 
		{ 
			sb.append(rl); 
		} 
	} 
		return sb.toString(); 
	} 
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com