天天看點

SpringBoot2.1.x,okhttp3網絡請求之MultipartFile方式上傳檔案,multipart/form-data表單多檔案+多參數

一)引入okhttp3的jar

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.0.0</version>
</dependency>
           

二)提供一個上傳服務接口,檔案類型為MultipartFile

package com.oysept.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.oysept.vo.FileVO;

@RestController
public class MultipartUploadController {

    /**
     * 該方式是二進制流操作, 适合所有類型檔案上傳
     * 通路位址: http://localhost:8080/okhttp3/post/multipartFile
     * 請求方式: POST
     * 傳參方式: multipart
     * @param dataVO
     * @return
     */
    @RequestMapping(value="/okhttp3/post/requestParam/multipart", method = RequestMethod.POST)
    public String multipartRequestParam(@RequestParam("files") MultipartFile multipartFile,
            @RequestParam("param") String param) {
        System.out.println("==>/okhttp3/post/requestParam/multipart,\n param: " + param + ",\n files: "+ multipartFile);
		
        // 處理業務邏輯
        return "/okhttp3/post/requestParam/multipart SUCCESS!";
    }
	
    // 通路位址: http://localhost:8080/okhttp3/post/responseBody/multipart
    // 多檔案+參數上傳
    @RequestMapping(value="/okhttp3/post/responseBody/multipart", method = RequestMethod.POST)
    public String multipartResponseBody(@RequestParam("files") MultipartFile multipartFile,
            FileVO fileVO) {
        System.out.println("==>/okhttp3/post/responseBody/multipart,\n fileVO: " + fileVO + ",\n files: "+ multipartFile);
		
        // 處理業務邏輯
        return "/okhttp3/post/responseBody/multipart SUCCESS!";
    }
}
           

三)用戶端提供調用方式,可傳入多個檔案+多個參數方式

package com.oysept.test;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * multipart/form-data表單多檔案+多參數
 * @author ouyangjun
 */
public class MultipartFileUploadTest {
	
    public static void main(String[] args) {
        // 請求位址
        String url = "http://localhost:8080/okhttp3/post/responseBody/multipart";
    	
        // 請求參數
        Map<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("files", new File("D:\\test.txt"));
        paramsMap.put("fileName", "GGGGG");
        paramsMap.put("fileSize", 555);
        paramsMap.put("fileType", "77777");
        httpMethod(url, paramsMap);
    }
    
    public static void httpMethod(String url, Map<String, Object> paramsMap) {
        // 建立client對象 建立調用的工廠類 具備了通路http的能力
        OkHttpClient client = new OkHttpClient()
                .newBuilder()
                .connectTimeout(60, TimeUnit.SECONDS) // 設定逾時時間
                .readTimeout(60, TimeUnit.SECONDS) // 設定讀取逾時時間
                .writeTimeout(60, TimeUnit.SECONDS) // 設定寫入逾時時間
                .build();
    	
        // 添加請求類型
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MediaType.parse("multipart/form-data"));
    	
        //  建立請求的請求體
        for (String key : paramsMap.keySet()) {
            // 追加表單資訊
            Object object = paramsMap.get(key);
            if (object instanceof File) {
                File file = (File) object;
                builder.addFormDataPart(key, file.getName(), RequestBody.create(file, null));
            } else {
                builder.addFormDataPart(key, object.toString());
            }
        }
        RequestBody body = builder.build();
    	
        // 建立request, 表單送出
        Request request = new Request.Builder()
            .url(url)
            .post(body)
            .build();
    	
        // 建立一個通信請求
        try (Response response = client.newCall(request).execute()) {
            // 嘗試将傳回值轉換成字元串并傳回
            System.out.println("==>傳回結果: " + response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
           

識别二維碼關注個人微信公衆号

SpringBoot2.1.x,okhttp3網絡請求之MultipartFile方式上傳檔案,multipart/form-data表單多檔案+多參數

本章完結,待續,歡迎轉載!

本文說明:該文章屬于原創,如需轉載,請标明文章轉載來源!

繼續閱讀