使用okhttp上传文件

dio*_*lla 8 java android okhttp

我正在完成这个使用okhttp与web服务进行通信的项目.

对于常规GET和POST,一切正常,但我无法正确上传文件.

okhttp文档非常缺乏这些主题,我在这里或任何地方找到的所有东西似乎都不适用于我的情况.

它应该很简单:我必须发送文件和一些字符串值.但我无法弄清楚如何做到这一点.

根据我发现的一些样本,我首先尝试了这个:

RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM)
    .addFormDataPart("group", getGroup())
    .addFormDataPart("type", getType())
    .addFormDataPart("entity", Integer.toString(getEntity()))
    .addFormDataPart("reference", Integer.toString(getReference()))
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"task_file\""), RequestBody.create(MediaType.parse("image/png"), getFile()))
    .build();
Run Code Online (Sandbox Code Playgroud)

它给了我一个"400错误请求"错误.

所以我从okhttp食谱中尝试了这个:

RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM)
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"group\""), RequestBody.create(null, getGroup()))
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"type\""), RequestBody.create(null, getType()))
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"entity\""), RequestBody.create(null, Integer.toString(getEntity())))
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"reference\""), RequestBody.create(null, Integer.toString(getReference())))
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"task_file\""), RequestBody.create(MediaType.parse("image/png"), getFile()))
    .build();
Run Code Online (Sandbox Code Playgroud)

结果相同.

不知道还有什么可以尝试或调查这个调查.

请求使用以下代码完成:

// adds the required authentication token
Request request = new Request.Builder().url(getURL()).addHeader("X-Auth-Token", getUser().getToken().toString()).post(requestBody).build();
Response response = client.newCall(request).execute();
Run Code Online (Sandbox Code Playgroud)

但我很确定问题是如何构建请求体.

我究竟做错了什么?

编辑:顺便说一句,上面的"getFile()"返回一个File对象.其余参数都是字符串和整数.

dio*_*lla 20

在最初的帖子之后我找到了回答我自己的问题.

我将它留在这里,因为它对其他人有用,因为有几个okhttp上传示例:

RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM)
        .addFormDataPart("group", getGroup())
        .addFormDataPart("type", getType())
        .addFormDataPart("entity", Integer.toString(getEntity()))
        .addFormDataPart("reference", Integer.toString(getReference()))
        .addFormDataPart("task_file", "file.png", RequestBody.create(MediaType.parse("image/png"), getFile()))
                                                .build();
Run Code Online (Sandbox Code Playgroud)

没有理由在配方中使用"addPart"和"Headers.of"等,addFormDataPart可以解决这个问题.

对于文件字段本身,它需要3个参数:name,filename,然后是文件体.而已.

  • 请注意,类“MultipartBuilder”不再存在。 (2认同)

Pra*_*ani 6

我只是改变了 addFormDataPart,而不是addPart和最后解决我的问题使用下面的代码:

  /**
     * Upload Image
     *
     * @param memberId
     * @param sourceImageFile
     * @return
     */
    public static JSONObject uploadImage(String memberId, String sourceImageFile) {

        try {
            File sourceFile = new File(sourceImageFile);

            Log.d(TAG, "File...::::" + sourceFile + " : " + sourceFile.exists());

            final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

            RequestBody requestBody = new MultipartBuilder()
                    .type(MultipartBuilder.FORM)
                    .addFormDataPart("member_id", memberId)
                    .addFormDataPart("file", "profile.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile))
                    .build();

            Request request = new Request.Builder()
                    .url(URL_UPLOAD_IMAGE)
                    .post(requestBody)
                    .build();

            OkHttpClient client = new OkHttpClient();
            Response response = client.newCall(request).execute();
            return new JSONObject(response.body().string());

        } catch (UnknownHostException | UnsupportedEncodingException e) {
            Log.e(TAG, "Error: " + e.getLocalizedMessage());
        } catch (Exception e) {
            Log.e(TAG, "Other Error: " + e.getLocalizedMessage());
        }
        return null;
    }
Run Code Online (Sandbox Code Playgroud)