1. 程式人生 > >OkHttp Post上傳檔案,攜帶引數

OkHttp Post上傳檔案,攜帶引數

使用 OkHttp 版本如下:

compile 'com.squareup.okhttp3:okhttp:3.4.1'

public void upLoadFile(final String url, final Map<String, Object> map, File file) {
        OkHttpClient client = new OkHttpClient();
        // form 表單形式上傳
        MultipartBody.Builder requestBody = new MultipartBody.Builder
().setType(MultipartBody.FORM); if (file != null) { // MediaType.parse() 裡面是上傳的檔案型別。 RequestBody body = RequestBody.create(MediaType.parse("image/*"), file); String filename = file.getName(); // 引數分別為, 請求key ,檔名稱 , RequestBody requestBody.addFormDataPart
("file", file.getName(), body); } if (map != null) { // map 裡面是請求中所需要的 key 和 value for (Map.Entry entry : map.entrySet()) { requestBody.addFormDataPart(valueOf(entry.getKey()), valueOf(entry.getValue())); } } Request request = new Request.Builder
().url(url).post(requestBody.build()).build(); // readTimeout("請求超時時間" , 時間單位); client.newBuilder().readTimeout(5000, TimeUnit.MILLISECONDS).build().newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.i("lfq", "onFailure"); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String str = response.body().string(); Log.e(TAG, str); } else { Log.i("lfq", response.message() + " error : body " + response.body().string()); } } }); }

MultipartBody.Builder 的 addFormDataPart 方法,是對於之前的 addPart 方法做了一個封裝,所以,不需要再去配置 Header 之類的。

或者,多檔案上傳

/**
     * post方式二:stirng型別引數和上傳檔案引數
     */
    public static Call uploadMoreFile(Map<String, Object> params) {
        //post請求方式二:multipart/form-data(不僅能夠上傳string型別的引數,還可以上傳檔案(流的形式,file))
        OkHttpClient okHttpClient1 = new OkHttpClient();
        MultipartBody.Builder builder1 = new MultipartBody.Builder();
        builder1.setType(MultipartBody.FORM);
        for (Map.Entry<String, Object> stringObjectEntry : params.entrySet()) {
            String key = stringObjectEntry.getKey();
            Object value = stringObjectEntry.getValue();
            if (value instanceof File) {//如果請求的值是檔案
                File file = (File) value;
                //MediaType.parse("application/octet-stream")以二進位制的形式上傳檔案
                builder1.addFormDataPart("引數名(檔案引數)", ((File) value).getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file));
            } else {//如果請求的值是string型別
                builder1.addFormDataPart(key, value.toString());
            }
        }
        Request request1 = new Request.Builder().post(builder1.build()).url(Constant.UPLOAD).build();
        Call call = okHttpClient1.newCall(request1);
        return call;
    }

使用方法

   //TODO 上傳
                new Thread() {
                    @Override
                    public void run() {
                        super.run();

                        Map<String, Object> map = new HashMap<>();
                        map.put("params", "value");

                        File[] files = new File[images.size()];
                        for (int i = 0; i < images.size(); i++) {
                            files[i] = new File(images.get(i));
                            map.put("file" + i, files[i]);
                        }
                        Util.upload(map).enqueue(new Callback() {
                            @Override
                            public void onFailure(Call call, IOException e) {
                            }

                            @Override
                            public void onResponse(Call call, Response response) throws IOException {
                                Gson gson = new Gson();
                                CrosseTalk duanzi = gson.fromJson(response.body().string(), CrosseTalk.class);
                                if (duanzi.getCode().equals("0")) {
                                    Log.d("TAG", "onResponse: " + "成功");
                                } else {
                                    Log.d("TAG", "onResponse: " + duanzi.getMsg());
                                }

                            }
                        });
                    }
                }.start();

單純的 Post 攜帶引數,那麼直接使用 FormBody

FormBody.Builder formBody = new FormBody.Builder();
if (map != null) {
    for (Map.Entry entry : map.entrySet()) {
        formBody.add(String.valueOf(entry.getKey()),String.valueOf(entry.getValue()));
    }
}

相關推薦

OkHttp Post檔案,攜帶引數

使用 OkHttp 版本如下: compile 'com.squareup.okhttp3:okhttp:3.4.1' public void upLoadFile(final

Android OkHttp Post檔案並且攜帶引數

這裡整理一下 OkHttp 的 post 在上傳檔案的同時,也要攜帶請求引數的方法。 使用 OkHttp 版本如下: compile 'com.squareup.okhttp3:okhttp:3.4.1' 程式碼如下: protected void po

okhttp post 檔案以及Multipart/form-data 的學習理解

在app 中,最基本的設定使用者頭像,需要進行頭像的圖片上傳,那就會使用到 post 進行上傳檔案的操作。必然要了解下 Multipart/form-data 的含義。以前在寫這部分程式碼的時候,不理解Headers.of(xxx)什麼意思,而且 裡面填寫的格式

OKhttp post檔案

 /**      * java.io.FileNotFoundException: /storage/emulated/0/note01.md: open failed: EACCES (Permission denied)      * 檔案未找到的異常....開啟失敗

Httpclient 以multipart/form-data形式post檔案及提交引數

在大學裡由於要做某些英語聽力作業,是在PC客戶端上的,而做完提交後顯示的答案又沒辦法複製,再重新填寫的話答案就消失了,所以懶得去記,好在答案圖片並不複雜,便想做一個可以識別出圖片中的英文的小軟體。因為我自己並沒有做OCR的經驗,於是我就到網上找可以線上識別文字的網站,找著找著

android http通過post檔案和提交引數(通過拼裝協議)

HttpURLConnection conn = null; DataOutputStream outStream = null;try{           String BOUNDARY = "---------------------------7da2137580

HttpClient通過post檔案和提交引數

       //new一個DiskFileItemFactory型別的物件factory(檔案工廠)                   DiskFileItemFactory factory = new DiskFileItemFactory();                   //為factory

HttpURLConnection Post請求檔案引數到servlet

public String uplaod(String actionUrl, Map<String, String> params) {         InputStream in = null;         String BOUNDARY = java.util.UUID.randomUU

OkHttp 3.0之後版本GET、POST請求以及POST檔案的示例程式碼

首先說一下2.x到3.x關於POST請求的請求體類的改變: 在2.x中是 類名是:FormEncodingBuilder() 在3.x中是 類名是: FormBody,但是一般使用是 FormBody.builder() 目前網上很多示例程式碼都是

.Net使用HttpClient以multipart/form-data形式post檔案及其相關引數

  目錄導航:      前言:      什麼是multipart/form-data請求:      Html上傳圖片按鈕:

C#中PUT和POST檔案

HttpClient中上傳檔案 上一篇主要是提到了HttpClient幫助類,這次針對於上傳檔案進行補充,僅做記錄 public static string HttpUploadFile(string url, string path) {

C# WebApi Post檔案大小限制

需要修改兩個地方   一般都在  web.config裡 <configuration> <system.web> <httpRuntime maxRequestLength="102400" executionTi

POST檔案

原文:https://blog.csdn.net/xiaojianpitt/article/details/6856536 POST上傳檔案 最早的HTTP POST是不支援檔案上傳的,給程式設計開發帶來很多問題。但是在1995年,ietf出臺了rfc1867,也就是《RFC 186

ajax 檔案post檔案,ajax 提交 JSON 格式的資料

ajax簡介 前後臺做資料互動 前後端做資料互動的方式(三種):     (1)瀏覽器視窗輸入地址(get的方式)(2)form表單提交資料(3)ajax提交資料 特點 特點:  (1)非同步       非同步與同步的區別:同步是請求發過去,要等著迴應;非同步不

httpclient post 檔案

@RequestMapping(value = "/uploadChatPicture", method = { RequestMethod.GET, RequestMethod.POST })     @ResponseBody     public Map<Stri

圖片攜帶引數至伺服器工具類

本篇採用的上傳方式是HttpUrlConnection方法,下篇將寫出xutils上傳的方法(包括多圖片上傳顯示進度條等)。敬請期待。 //UpLoadFileVideoUtils這個類就是工具類,只需要將這個類拷貝至專案中即可使用。下面是程式碼部分: 解釋下方法裡面的引數

通過 HTTP POST 檔案到伺服器

2. 上傳之前使用者無法預知上傳檔案的數目. 3. 因為是 ASP.NET 應用, 客戶端可能沒有裝 .NET Framework. 其實,我們知道.如果要跟 IE 端客戶檔案系統互動的話,程式碼必須在客戶端執行. 這個時候我們可以寫一個 Activex 控制元件來實現選擇資料夾和上傳. 一般我們常用兩種方

java、 http模擬post檔案到服務端 模擬form檔案

需求是這樣的: **1,前後端分離,前端對接pc軟體進行檔案同步的介面,後的springboot微服務進行檔案接收和處理。 2,軟體不能直接呼叫微服務的介面進行上傳,只能先走一下前端controller進行轉發過來()。 3,這樣就只能用httpclien

Shell 程式設計用CURL 模擬POST 檔案 解決417 Expectation

話不多說直接拋程式碼 curl -H "Expect:" -F "passport=monitor_134" -F "[email protected]/root/monitor/result/mid_1_rule_1.txt" http://192.168.1

curl post檔案的“failed creating formpost data“錯誤

之前寫過一個php使用curl上傳檔案的程式碼,今天暴出了一個bug,curl錯誤資訊為"failed creating formpost data" 先說一下curl上傳檔案的過程吧 $file =array("upimg"=>"@/tmp/tmp.jpg");