OkHttp + Spring的多部分文件上传

7

我最近切换到OkHttp。 切换后,下面的代码执行上传操作。

RequestBody requestBody = new MultipartBuilder()
                        .type(MultipartBuilder.FORM)
                        .addPart(
                                Headers.of("Content-Disposition", "form-data; name=\"qqfile\""),
                                RequestBody.create(
                                        MediaType.parse(filename),
                                        new File(filename)))
                        .build();

如果您比较这两张图片,第二张图片中的 multipartFiles 的大小为0。它应该是 size = 1。如何正确地使用 OkHttp 填充 multipartHttpRequest,以便使服务器接受成功上传?
控制器代码:
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import org.springframework.http.MediaType;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.util.WebUtils;

@RequestMapping (
        method = RequestMethod.POST,
        value = "/upload",
        produces = MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8"
)
public String upload(
        HttpServletRequest request,
        HttpServletResponse response
) throws IOException {
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    if (isMultipart) {
        MultipartHttpServletRequest multipartHttpRequest = 
        WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);

        final List<MultipartFile> files = multipartHttpRequest.getFiles("qqfile");

        if (files.isEmpty()) {
            LOG.error("qqfile name missing in request or no file uploaded");
            return some error code here
        }

        MultipartFile multipartFile = files.iterator().next();
        //process file code below
    }
    return failure;
}

你能展示一下你的控制器吗? - Marcus Henrique
@MarcusHenrique 我已经添加了控制器代码。 - java_dude
2个回答

5

您可以更轻松地获取MultipartFile:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String upload(@RequestParam("qqfile") MultipartFile file) throws IOException {
    if (!file.isEmpty()) {
        // ...
    }
    return "failure";
}

然后,使用OkHttp:

RequestBody body = new MultipartBuilder()
    .addFormDataPart("qqfile", filename, RequestBody.create(MediaType.parse("media/type"), new File(filename)))
    .type(MultipartBuilder.FORM)
    .build();

Request request = new Request.Builder()
    .url("/path/to/your/upload")
    .post(body)
    .build();

OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();

对我来说,那很好用。

使用MediaType.parse(filename)时要小心,必须传递有效的类型,例如text/plain、application/json、application/xml等...


4
Builder requestBodyBuilder = new MultipartBody.Builder()
                        .setType(MultipartBody.FORM);
File file= new File(FILE_PATH + FILE_NAME);
requestBodyBuilder.addFormDataPart("file", FILE_NAME, RequestBody.create(MultipartBody.FORM, file));

fileVO.getOriginalFlnm()

您可以省略此字段。

同时,您需要在标头中设置'MultipartHttpServletRequest'参数和consumes, produces

@PostMapping(path = "/save", consumes = "multipart/*", produces = "application/json;charset=utf-8")
public boolean CONTROLLER(MultipartHttpServletRequest request, @RequestParam Map<String, Object> param) {
    boolean result = SERVICE.save(request, param);
    return result;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接