① android的自帶的httpClient 怎麼上傳文件
在Android開發中,Android SDK附帶了Apache的HttpClient,它是一個完善的客戶端。它提供了對HTTP協議的全面支持,可以使用HttpClient的對象來執行HTTP GET和HTTP POST調用。
HTTP工作原理:
1.客戶端(一般是指瀏覽器,這里是指自己寫的程序)與伺服器建立連接
2.建立連接後,客戶端向伺服器發送請求
3.伺服器接收到請求後,向客戶端發送響應信息
4.客戶端與伺服器斷開連接
HttpClient的一般使用步驟:
1.使用DefaultHttpClient類實例化HttpClient對象
2.創建HttpGet或HttpPost對象,將要請求的URL通過構造方法傳入HttpGet或HttpPost對象。
3.調用execute方法發送HTTP GET或HTTP POST請求,並返回HttpResponse對象。
4.通過HttpResponse介面的getEntity方法返回響應信息,並進行相應的處理。
最後記得要在AndroidManifest.xml文件添加網路許可權
<uses-permission android:name="android.permission.INTERNET" />
附件中包含了一個拍照上傳的源代碼
② android-async-http批量上傳
我這有個httpclient寫的工具類
批量上傳的話,只需要傳遞一個FIle對象還可以帶上傳進度條
服務端的話就簡單了
如果是struts的話,只要定義一個fileUpload的攔截器,定義一個List<File> 對象就會自動注入了
如果是servlet的話,那就要用FileUpload + io 兩個架包,自己寫代碼去讀取文件了
我這有個客戶端,android寫的
③ android okhttp上傳文件mediatype有哪些
/**
* @param mediaType MediaType
* @param uploadUrl put請求地址
* @param localPath 本地文件路徑
* @return 響應的結果 和 HTTP status code
* @throws IOException
*/
public String put(MediaType mediaType, String uploadUrl, String localPath) throws IOException {
File file = new File(localPath);
RequestBody body = RequestBody.create(mediaType, file);
Request request = new Request.Builder()
.url(uploadUrl)
.put(body)
.build();
Response response = client.newCall(request).execute();
return response.code()+ ":" + response.body().string() ;
}
//上傳JPG圖片
public String putImg(String uploadUrl, String localPath) throws IOException {
MediaType Image = MediaType.parse("image/jpeg; charset=utf-8");
④ Android中使用HttpPost實現數據與文件同時上傳的功能
第一步:編寫一個Servlet,把接收到的HTTP信息保存在一個文件中,代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取輸入流,是HTTP協議中的實體內容
ServletInputStream sis=request.getInputStream();
//緩沖區
byte buffer[]=new byte[1024];
FileOutputStream fos=new FileOutputStream("d://file.log");
int len=sis.read(buffer, 0, 1024);
//把流里的信息循環讀入到file.log文件中
while( len!=-1 )
{
fos.write(buffer, 0, len);
len=sis.readLine(buffer, 0, 1024);
}
fos.close();
sis.close();
}
第二步:實現如下圖1的的表單頁面,生成一個注冊表單,提交到Servlet中
詳細的代碼如下:
<form action="servlet/ReceiveFile" method="post" enctype="multipart/form-data">
第一個參數<input type="text" name="name1"/> <br/>
第二個參數<input type="text" name="name2"/> <br/>
第一個上傳的文件<input type="file" name="file1"/> <br/>
第二個上傳的文件<input type="file" name="file2"/> <br/>
<input type="submit" value="提交">
</form>
注意了,由於要上傳附件,所以一定要設置enctype為multipart/form-data,才可以實現附件的上傳。
第三步:填寫完信息後按「提交」按鈕後,在D盤下查找file.log文件用記事本打開,數據如下:
-----------------------------7d92221b604bc
Content-Disposition: form-data; name="name1"
hello
-----------------------------7d92221b604bc
Content-Disposition: form-data; name="name2"
world
-----------------------------7d92221b604bc
Content-Disposition: form-data; name="file1"; filename="C:/2.GIF"
Content-Type: image/gif
GIF89a
⑤ 說說在 Android 中如何發送 HTTP 請求
客戶端會向伺服器發出一條 HTTP 請求,伺服器收到請求後會返回一些數據給客戶端,然後客戶端再對這些數據進行解析與處理。
可以使用 HttpURLConnection(官方推薦) 來發送 HTTP 請求。
布局文件:
活動類:
因為在 Android 中不允許在子線程中執行 UI 操作,所以我們通過 runOnUiThread 方法,切換為主線程,然後再更新 UI 元素。
最後記得聲明網路許可權哦:
OKHttp 是一個處理網路請求的開源項目,目前是 Android 最火熱的輕量級框架,由移動支付 Square 公司貢獻(該公司還貢獻了Picasso)。希望替代 HttpUrlConnection 和 Apache HttpClient。
首先引入 OKHttp 庫依賴:
然後點擊 Android Studio 右上角的 Sync Now,把庫真正載入進來。
修改活動類:
可以在 build() 方法之前連綴很多其他方法來豐富這個 Request 對象。
如果是 POST 請求,那麼需要構建 RequestBody 對象,形如:
修改活動類:
注意: new Thread(...) 之後需要執行 start() 才會啟動線程哦。
運行:
可以看出,OKHttp 比 HttpURLConnection 更強大:同一個網址,OKHttp 能夠正確地返回響應數據哦O(∩_∩)O哈哈~
⑥ Android Q 上基於 OkHttp 上傳(大)文件的實現
如圖,RequestBody 有好幾個 create 方法,可以滿足不同場景下的內容上傳,比如字元串、位元組數組和文件。
顯然,字元串和位元組數組是不能上傳大文件的,均可能 OOM。
那麼,就只能使用 RequestBody create(MediaType contentType, File file) 方法了。正常情況下也是沒什麼問題的,但是在 Android Q 上,由於存儲許可權的變更,將導致無法直接訪問從內容庫所選擇的文件。
得到如下日誌:
可見,即使通過 uri 得到了文件的真實路徑,也是無法直接訪問的。
通過上面的實驗可以看到,我們是無法直接通過 File 相關的 API 訪問原始文件的,但是我們卻可以通過 ContentResolver 得到原始文件的流。
類似地,可以基於流或者 FileDescriptor 對圖片解碼成 Bitmap,參考:
⑦ android使用httpURLconnection怎麼同時上傳文件和參數到伺服器
// 首先組拼文本類型的參數
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINEND);
sb.append("Content-Disposition: form-data; name=\""
+ entry.getKey() + "\"" + LINEND);
sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
sb.append(LINEND);
sb.append(entry.getValue());
sb.append(LINEND);
}
DataOutputStream outStream = new DataOutputStream(
conn.getOutputStream());
outStream.write(sb.toString().getBytes());