okhttp大文件上傳
Ⅰ Android 使用OkhttpUtils上傳圖片
IMAGE_FILE_NAME這個確定是文件路徑么?
那個其他我看不出來,我上傳圖片用的都是Xutils,你可以搜搜試試。
Ⅱ android 怎麼多圖上傳 okhttp
android上傳圖片是先將圖片文件轉換成流文件:可用以下代碼轉換流文件,imgPath為圖片的完整地址
//圖片轉化成base64字元串
public static String imgToBase64(String imgPath) {
InputStream in = null;
byte[] data = null;
//讀取圖片位元組數組
try {
in = new FileInputStream(imgPath);
data = new byte[in.available()];
in.read(data);
in.close();
}
catch (IOException e){
e.printStackTrace();
}
//對位元組數組Base64編碼
sun.misc.BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);//返回Base64編碼過的位元組數組字元串
}
然後圖片文件就成為一串字元串啦,傳遞方法和普通字元串一樣,多圖使用分號隔開即可,後台收到後直接將流文件轉換成圖片保存即可。
Ⅲ OKHttp使用詳解
OkHttp 是一個默認高效的 HTTP 客戶端:
在使用 OkHttp 發送 HTTP 請求時,首先需要獲取一個 OkHttpClient 對象,獲取 OkHttpClient 對象的方式很簡單,在 OkHttp 中大量使用了 Builder 模式。獲取 OkHttpClient 對象的方法如下所示:
GET 請求的執行步驟如下:
POST 請求的構建步驟與 GET 相似,區別是,在構建 Request 對象基基時 在 post() 方法中,設置需轎蔽要發送的數據,發送的數據可為目前流行的 JSON 格式數據,也可以模擬 Form 表單提交的數據,操作如下所示:
構建完 Request 對象後的步驟,就與 GET 請求相似,構建 Call 對象然後,在發送 同步 或 非同步 請求
在 OkHttp 中 進行文件的上傳,是相當簡單的,在發送 POST 請求時,只需要構造一個 MultipartBody 對象即可, MultipartBody 對象可以發送 文件數據,也可以發搏帆謹送基本類型的數據。
OkHttp 作為網路請求工具,簡單且功能強大,並且其大量使用了 構建者模式。
Ⅳ Android Q 上基於 OkHttp 上傳(大)文件的實現
如圖,RequestBody 有好幾個 create 方法,可以滿足不同場景下的內容上傳,比如字元串、位元組數組和文件。
顯然,字元串和位元組數組是不能上傳大文件的,均可能 OOM。
那麼,就只能使用 RequestBody create(MediaType contentType, File file) 方法了。正常情況下也是沒什麼問題的,但是在 Android Q 上,由於存儲許可權的變更,將導致無法直接訪問從內容庫所選擇的文件。
得到如下日誌:
可見,即使通過 uri 得到了文件的真實路徑,也是無法直接訪問的。
通過上面的實驗可以看到,我們是無法直接通過 File 相關的 API 訪問原始文件的,但是我們卻可以通過 ContentResolver 得到原始文件的流。
類似地,可以基於流或者 FileDescriptor 對圖片解碼成 Bitmap,參考:
Ⅳ okhttp 怎麼管理 cookie
OkHttp和HttpURLConnection一樣, 是面向java的, 而且是做socket層的事情的, 使用時要在子線程調用, 通過handler發送結果到主線程. 而NoHttp和Volley不是做socket層的東西. 直接在主線程就可以調用, 拿到結果後直接更新UI, 不需要用handler去發送, 很簡單.
不過我推薦使用NoHttp. 原因是NoHttp封裝了: 文件下載, 斷點續傳, 304緩存, 302/303傳參數, 傳文件, 請求頭, 多文件上傳, 大文件上傳, Cookie自動管理等多種功能, 這些是Volley而沒有, 使用Volley時這些功能要我們去寫蠻多代碼來再次封裝.
而且Volley用的HttpClient來解析的, Android6.0刪除了HttpClient後, 我們在6.0下也不能使用Volley的源碼了, 所以還是用NoHttp吧, NoHttp兼容2.0-6.0以上
而使用OkHttp還需要我們自己去封裝, 而且Android4.4之後NoHttp也是使用OkHttp做底層的.
Ⅵ Okhttp 使用(同步、非同步/get、post/上傳文件)
目前Android端調用網路請求最常用的框架就是OKHttp,目前項目中也經常會用到。OKHTTP有哪些特點呢?下面是官網給出的OKHTTP的特點:
官網地址: https://square.github.io/okhttp/
想要詳細了解HTTP/2,可以參考: https://www.jianshu.com/p/828a29bced9f
接下來就可以愉快的開始使用OKhttp進行開發了。
OKhttpclient通過builder構建,構建的時候涉及到很多配置項,本次簡單對其中一些配置項做了說明,後續會對一些重要的配置項做專題說明正察。在實際的項目中的配置項根據項目具體需求進行配置。
上述配置項中比較常用的有
同步get請求會阻塞當前線程直到返回舉枝茄結果,請求大致分為四個步驟:
非同步請求方式的步驟和上述前兩個步驟基本搭拍一致,主要發起請求的方式發生了變化,結果通過回調返回。這種請求方式對請求的線程沒有限制。
與get請求方式不同的是post請求需要構建RequestBody,在請求時攜帶RequestBody。
Ⅶ okhttp 上傳文件socket關閉怎麼解決
使用okhttp上傳文件時,每次上傳超過5M的文件就會失敗, java.net.SocketException: sendto failed: EPIPE (Broken pipe)
原因是okhttp的請求頭RequestBody出現了問題
原襪坦代碼:
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), RequestBody.create(null, file))
.addFormDataPart("filekey", fileKey)
.addFormDataPart("isSend", "true")
.addPart(Headers.of("Content-Disposition", "告凳桐form-data; name=\"another\粗陵";filename=" + file.getName() + "")
,RequestBody.create(MediaType.parse("application/octet-stream"), file))
.build();
改正後的代碼,刪除了addPart
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), RequestBody.create(null, file))
.addFormDataPart("filekey", fileKey)
.addFormDataPart("isSend", "true")
.build();
Ⅷ okhttp的對象如何傳參
1 okhttp的對象可以通過Builder模式進棗判行傳參凳段改。
2 Builder模式可以傳入請求的URL、請求類型、請求體、請求頭等參數,同時也可以對超時時間、重定向、緩存策略等燃埋進行配置。
3 如果需要上傳文件或者流,可以通過RequestBody類進行封裝,在Builder中傳入RequestBody對象即可。
延伸:在實際開發中,通過Builder模式進行配置和傳參可以提高靈活性和可維護性,將參數進行封裝,可以避免參數傳遞不當導致的問題,同時也可方便進行單元測試。
Ⅸ okhttp最大支持上傳多大的文件
/**
* 上傳文件
* @param actionUrl 連接地址
* @param paramsMap 參數
* @param callback 回調
* @param <T>
*/
public static <T>void upLoadFile(String actionUrl, HashMap<String, Object> paramsMap, Callback callback) {
// RequestBody requestBody = new MultipartBuilder() //建立請求的內容
// .type(MultipartBuilder.FORM)//表單形式
// .addFormDataPart("token", token)//攜帶的參數
// .addFormDataPart("file", file.getName(), RequestBody.create(null, file))//第一個參數是伺服器接收的名稱,第二個是上傳文件的名字,第三個是上傳的文件
// .build();
// Request request = new Request.Builder()//建立請求
// .url(url)//請求的地址
// .post(requestBody)//請求的內容(上面建立的requestBody)
// .build();
try {
OkHttpClient okHttpClient = new OkHttpClient();
MultipartBuilder builder = new MultipartBuilder();
builder.type(MultipartBuilder.FORM);
//追加參數
for (String key : paramsMap.keySet()) {
Object object = paramsMap.get(key);
if (!(object instanceof File)) {
builder.addFormDataPart(key, object.toString());
} else {
File file = (File) object;
builder.addFormDataPart(key, file.getName(), RequestBody.create(null, file));
}
}
//創建RequestBody
RequestBody body = builder.build();
//創建Request
final Request request = new Request.Builder().url(actionUrl).post(body).build();
HLog.v("upLoadFile","upLoadFile",request.urlString());
Call call=okHttpClient.newCall(request);
call.enqueue(callback);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
Ⅹ Okhttp上傳文件(視頻並攜帶參數)
之前我在csdn上寫過一枝滾篇okhttp上傳圖片頭像的參數解釋:
https://blog.csdn.net/Hu_wenpeng/article/details/105492603
是這樣寫的 因為網路請求 還是retrofit+okhttp
所以請兆搭咐求方法定義成下面這樣:
在這里總結一下 只要和服務能夠通信成功 說明我們寫的方式是沒有錯的,無法是一些參數的問題,不要一看返回非200 就認為自族純己寫的方式有問題