android - 使用 Retrofit 2 上传文件

标签 android file-upload retrofit retrofit2

我尝试了几天,我真的做到了一切...... 以下是请求在 Postman 中的样子: enter image description here

enter image description here

我确信所有 GET 参数都正确写入。我想是我如何发送要上传的文件的问题。

            Map<String, RequestBody> map = new HashMap<>();
            File file = new File("/storage/emulated/0/ConstructSecure/d1940b05-76d1-4d98-b4b4-b04b8247c8cb.png");
            RequestBody requestBody = RequestBody.create(MediaType.parse("image/png"), file);
            String fileName = file.getName();
            map.put("attachment\"; filename=\"" + fileName + "\"", requestBody);

            //GET parameters
            Map<String, String> params = new HashMap<String, String>();
            params.put("inspectionUUID", inspectionUUID);
            params.put("noteUUID", noteUUID);
            params.put("attachmentUUID", attachmentUUID);
            params.put("noteType", noteType);
            params.put("modifiedTime", modifiedTime);

            Call<ResponseBody> call = service.upload(access_token,params,map);
            call.enqueue()....

接口(interface):

@Multipart
    @POST("api/MediaFiles/AddMediaFile")
    Call<ResponseBody> upload(
            @Header("Authorization") String authorization,
            /* GET params */ @QueryMap Map<String, String> params,
            @PartMap Map<String, RequestBody> map
    );

谁能帮帮我?

最佳答案

我花了很多时间搜索如何将文件作为字节流发送,因为网络上的所有答案都解释了通过 RequestBody 上传,但它不适用于我的情况。 所以,这里是解决方案:

InputStream in = new FileInputStream(file);
    byte[] buf = new byte[in.available()];
    while (in.read(buf) != -1) ;
    RequestBody requestBodyByte = RequestBody
            .create(MediaType.parse("application/octet-stream"), buf);
    String content_disposition = "attachment; filename=\"" + fileName + "\"";

    //GET parameters
    Map<String, String> params = new HashMap<String, String>();
    params.put("inspectionUUID", inspectionUUID);
    params.put("noteUUID", noteUUID);
    params.put("attachmentUUID", attachmentUUID);
    params.put("noteType", noteType);
    params.put("modifiedTime", modifiedTime);

    Call<ResponseBody> call = service.upload(access_token, content_disposition, requestBodyByte, params);

接口(interface):

 @POST("api/MediaFiles/AddMediaFile")
    Call<ResponseBody> upload(
            @Header("Authorization") String authorization,@Header("Content-Disposition") String content_disposition, @Body RequestBody photo,
            /* GET params */ @QueryMap Map<String, String> params
    );

关于android - 使用 Retrofit 2 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37128246/

相关文章:

Android 'complete action using' 后退按钮按下处理

c++ - C++ 如何将文件发送到浏览器

java - 从 OKHttp 拦截器返回错误(使用改造)

kotlin - 无法为 retrofit2.Call 调用无参数构造函数

java - 在前一个方法完成之前调用的方法

android - 针对不同设备缩放 Android Canvas 2D 图形

android - 来自错误线程的 Realm 访问

iphone - Photobucket iOS 集成

android - 如何在 Android 中禁用状态栏点击和下拉?