JAVA通過(guò)HttpURLConnection 上傳和下載文件的方法
本文介紹了JAVA通過(guò)HttpURLConnection 上傳和下載文件的方法,分享給大家,具體如下:
HttpURLConnection文件上傳
HttpURLConnection采用模擬瀏覽器上傳的數(shù)據(jù)格式,上傳給服務(wù)器
上傳代碼如下:
package com.util;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.Map;
/**
* Java原生的API可用于發(fā)送HTTP請(qǐng)求,即java.net.URL、java.net.URLConnection,這些API很好用、很常用,
* 但不夠簡(jiǎn)便;
*
* 1.通過(guò)統(tǒng)一資源定位器(java.net.URL)獲取連接器(java.net.URLConnection) 2.設(shè)置請(qǐng)求的參數(shù) 3.發(fā)送請(qǐng)求
* 4.以輸入流的形式獲取返回內(nèi)容 5.關(guān)閉輸入流
*
* @author H__D
*
*/
public class HttpConnectionUtil {
/**
* 多文件上傳的方法
*
* @param actionUrl:上傳的路徑
* @param uploadFilePaths:需要上傳的文件路徑,數(shù)組
* @return
*/
@SuppressWarnings("finally")
public static String uploadFile(String actionUrl, String[] uploadFilePaths) {
String end = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
DataOutputStream ds = null;
InputStream inputStream = null;
InputStreamReader inputStreamReader = null;
BufferedReader reader = null;
StringBuffer resultBuffer = new StringBuffer();
String tempLine = null;
try {
// 統(tǒng)一資源
URL url = new URL(actionUrl);
// 連接類的父類,抽象類
URLConnection urlConnection = url.openConnection();
// http的連接類
HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
// 設(shè)置是否從httpUrlConnection讀入,默認(rèn)情況下是true;
httpURLConnection.setDoInput(true);
// 設(shè)置是否向httpUrlConnection輸出
httpURLConnection.setDoOutput(true);
// Post 請(qǐng)求不能使用緩存
httpURLConnection.setUseCaches(false);
// 設(shè)定請(qǐng)求的方法,默認(rèn)是GET
httpURLConnection.setRequestMethod("POST");
// 設(shè)置字符編碼連接參數(shù)
httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
// 設(shè)置字符編碼
httpURLConnection.setRequestProperty("Charset", "UTF-8");
// 設(shè)置請(qǐng)求內(nèi)容類型
httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
// 設(shè)置DataOutputStream
ds = new DataOutputStream(httpURLConnection.getOutputStream());
for (int i = 0; i < uploadFilePaths.length; i++) {
String uploadFile = uploadFilePaths[i];
String filename = uploadFile.substring(uploadFile.lastIndexOf("http://") + 1);
ds.writeBytes(twoHyphens + boundary + end);
ds.writeBytes("Content-Disposition: form-data; " + "name=\"file" + i + "\";filename=\"" + filename
+ "\"" + end);
ds.writeBytes(end);
FileInputStream fStream = new FileInputStream(uploadFile);
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int length = -1;
while ((length = fStream.read(buffer)) != -1) {
ds.write(buffer, 0, length);
}
ds.writeBytes(end);
/* close streams */
fStream.close();
}
ds.writeBytes(twoHyphens + boundary + twoHyphens + end);
/* close streams */
ds.flush();
if (httpURLConnection.getResponseCode() >= 300) {
throw new Exception(
"HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
}
if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
inputStream = httpURLConnection.getInputStream();
inputStreamReader = new InputStreamReader(inputStream);
reader = new BufferedReader(inputStreamReader);
tempLine = null;
resultBuffer = new StringBuffer();
while ((tempLine = reader.readLine()) != null) {
resultBuffer.append(tempLine);
resultBuffer.append("\n");
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (ds != null) {
try {
ds.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (inputStreamReader != null) {
try {
inputStreamReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultBuffer.toString();
}
}
public static void main(String[] args) {
// 上傳文件測(cè)試
String str = uploadFile("http://127.0.0.1:8080/image/image.do",new String[] { "/Users//H__D/Desktop//1.png","http://Users/H__D/Desktop/2.png" });
System.out.println(str);
}
}
HttpURLConnection文件下載
下載代碼如下:
package com.util;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.Map;
/**
* Java原生的API可用于發(fā)送HTTP請(qǐng)求,即java.net.URL、java.net.URLConnection,這些API很好用、很常用,
* 但不夠簡(jiǎn)便;
*
* 1.通過(guò)統(tǒng)一資源定位器(java.net.URL)獲取連接器(java.net.URLConnection) 2.設(shè)置請(qǐng)求的參數(shù) 3.發(fā)送請(qǐng)求
* 4.以輸入流的形式獲取返回內(nèi)容 5.關(guān)閉輸入流
*
* @author H__D
*
*/
public class HttpConnectionUtil {
/**
*
* @param urlPath
* 下載路徑
* @param downloadDir
* 下載存放目錄
* @return 返回下載文件
*/
public static File downloadFile(String urlPath, String downloadDir) {
File file = null;
try {
// 統(tǒng)一資源
URL url = new URL(urlPath);
// 連接類的父類,抽象類
URLConnection urlConnection = url.openConnection();
// http的連接類
HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
// 設(shè)定請(qǐng)求的方法,默認(rèn)是GET
httpURLConnection.setRequestMethod("POST");
// 設(shè)置字符編碼
httpURLConnection.setRequestProperty("Charset", "UTF-8");
// 打開(kāi)到此 URL 引用的資源的通信鏈接(如果尚未建立這樣的連接)。
httpURLConnection.connect();
// 文件大小
int fileLength = httpURLConnection.getContentLength();
// 文件名
String filePathUrl = httpURLConnection.getURL().getFile();
String fileFullName = filePathUrl.substring(filePathUrl.lastIndexOf(File.separatorChar) + 1);
System.out.println("file length---->" + fileLength);
URLConnection con = url.openConnection();
BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream());
String path = downloadDir + File.separatorChar + fileFullName;
file = new File(path);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
OutputStream out = new FileOutputStream(file);
int size = 0;
int len = 0;
byte[] buf = new byte[1024];
while ((size = bin.read(buf)) != -1) {
len += size;
out.write(buf, 0, size);
// 打印下載百分比
// System.out.println("下載了-------> " + len * 100 / fileLength +
// "%\n");
}
bin.close();
out.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
return file;
}
}
public static void main(String[] args) {
// 下載文件測(cè)試
downloadFile("http://localhost:8080/images/1467523487190.png", "/Users/H__D/Desktop");
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA 2021配置JavaWeb項(xiàng)目超詳細(xì)教程
本文通過(guò)圖文并茂的形式給大家介紹IDEA 2021配置JavaWeb項(xiàng)目的過(guò)程,內(nèi)容簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-08-08
IDEA里找不到Maven的有效解決辦法(小白超詳細(xì))
這篇文章主要給大家介紹了關(guān)于IDEA里找不到Maven的有效解決辦法,文中通過(guò)圖文將解決的辦法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
Spring Boot jar 啟動(dòng)時(shí)設(shè)置環(huán)境參數(shù)的操作
這篇文章主要介紹了Spring Boot jar 啟動(dòng)時(shí)設(shè)置環(huán)境參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot利用@Validated注解優(yōu)雅實(shí)現(xiàn)參數(shù)校驗(yàn)
在開(kāi)發(fā) Web 應(yīng)用時(shí),用戶輸入的合法性校驗(yàn)是保障系統(tǒng)穩(wěn)定性的基礎(chǔ),?Spring Boot 的 @Validated 注解 提供了一種更優(yōu)雅的解決方案,下面就跟隨小編一起學(xué)習(xí)一下吧2025-04-04
springboot AutoConfigureAfter控制Bean的注入順序方法詳解
這個(gè)文章主要介紹一下@AutoConfigureAfter在spring框架中的作用,在使用過(guò)程中,很多開(kāi)發(fā)人員在使用它的時(shí)候都出現(xiàn)了問(wèn)題,問(wèn)題比較多的就是它們的注冊(cè)順序總不是我們預(yù)期的,下面介紹一下正常的使用方法,感興趣的朋友一起看看吧2024-05-05
Java二維數(shù)組與動(dòng)態(tài)數(shù)組ArrayList類詳解
這篇文章主要給大家介紹了關(guān)于Java二維數(shù)組與動(dòng)態(tài)數(shù)組ArrayList類的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java封裝公共Result結(jié)果返回類的實(shí)現(xiàn)
在使用Java開(kāi)發(fā)接口請(qǐng)求中,我們需要對(duì)請(qǐng)求進(jìn)行進(jìn)行統(tǒng)一返回值,這時(shí)候我們自己封裝一個(gè)統(tǒng)一的Result返回類,本文主要介紹了Java封裝公共Result結(jié)果返回類的實(shí)現(xiàn),感興趣的可以了解一下2023-01-01

