发送带有改造 2 的图像文件

Sending image file with retrofit 2

我正在尝试使用 Retrofit 2 将图像上传到我们项目的服务器

图像是通过图像拾取 activity 拾取的,并且似乎可以工作,因为可以使用 Picasso 显示文件(图像)。

Retrofit 成功,但服务器似乎没有获取文件。 这是服务器端部分。

func (c *gin.Context) {
   file, header , err := c.Request.FormFile("profileImage")
   // err = http: no such file
}

Sever side error message

当我测试它时,甚至 RequestBody 打印出连贯的信息(尺寸、图像类型...)

服务:

@Multipart
@PATCH("/user/profileImage")
Call<ResponseBody> modifyUserImage(@Part("profileImage") RequestBody profileImage, @Part("userID") RequestBody userID);

以下代码是同一片段的一部分class

开启图片选取activity:

Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
getIntent.setType("image/*");

Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/*");

Intent chooserIntent = Intent.createChooser(getIntent, "Select Image");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent});

startActivityForResult(chooserIntent, 1);

上 Activity 结果:

    @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == Activity.RESULT_OK && requestCode == 1) {
        // process the result
        Uri selectedImage = data.getData();
        String wholeID = DocumentsContract.getDocumentId(selectedImage);
        String id = wholeID.split(":")[1];
        String[] column = {MediaStore.Images.Media.DATA};
        String sel = MediaStore.Images.Media._ID + "=?";
        Cursor cursor = getActivity().getContentResolver().
                query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        column, sel, new String[]{id}, null);
        String filePath = "";
        int columnIndex = cursor.getColumnIndex(column[0]);
        if (cursor.moveToFirst()) {
            filePath = cursor.getString(columnIndex);
        }
        cursor.close();

        file = new File(filePath);
        Picasso
                .with(getActivity().getApplicationContext())
                .load(file)
                .into(civ_userProfilePicture);
    }
}

要求:

Call<ResponseBody> call = ServiceSingelton.getmInstance().getService()
                        .modifyUserImage(RequestBody.create(MediaType.parse("image/*"), file),
                                         RequestBody.create(MediaType.parse("text/plain"), ServiceSingelton.getmInstance().getUserID()));

call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        if (response.code() == 200) {
            Log.d("RETROFIT SUCCESS", "Pic should be sent");
        } else {
            Log.d("RETROFIT SUCCESS", "Error code received modifying user");
        }
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        Log.d("RETROFIT ERROR", t.getMessage());
    }
});

有人给了我这个有效的修复程序:

To post a part with filename, you should change @Part("profileImage") RequestBody profileImage to @Part RequestBody profileImage, and pass it MultipartBody.Part.createFormData(partName, filename, requestBody):

// Service
@Multipart
@PATCH("/user/profileImage")
Call<ResponseBody> modifyUserImage(@Part MultipartBody.Part profileImage, @Part("userID") RequestBody userID);

// Call
MultipartBody.Part imagePart = MultipartBody.Part.createFormData("profileImage", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));
Call<ResponseBody> call = ServiceSingelton.getmInstance().getService()
                        .modifyUserImage(imagePart,
                                         RequestBody.create(MediaType.parse("text/plain"), ServiceSingelton.getmInstance().getUserID()));