如何在 Retrofit 2 中上传图像文件

新手上路,请多包涵

我有一张邮递员的图片,如下所示。我怎样才能在 Retrofit 2 中做同样的事情?

在此处输入图像描述

我已经像这样声明了接口:

 @Multipart
@POST("/api/Pharmarcy/UploadImage")
Call<ResponseBody> uploadPrescriptionImage(
        @Query("accessToken") String token,
        @Query("pharmarcyRequestId") int pharmacyRequestedId,
        @Part MultipartBody.Part image);

原文由 Azlan Jamal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答
@Multipart
@POST("user/updateprofile")
Observable<ResponseBody> updateProfile(@Part("user_id") RequestBody id,
                                       @Part("full_name") RequestBody fullName,
                                       @Part MultipartBody.Part image,
                                       @Part("other") RequestBody other);

//pass it like this
File file = new File("/storage/emulated/0/Download/Corrections 6.jpg");
RequestBody requestFile =
        RequestBody.create(MediaType.parse("multipart/form-data"), file);

// MultipartBody.Part is used to send also the actual file name
MultipartBody.Part body =
        MultipartBody.Part.createFormData("image", file.getName(), requestFile);

// add another part within the multipart request
RequestBody fullName =
        RequestBody.create(MediaType.parse("multipart/form-data"), "Your Name");

service.updateProfile(id, fullName, body, other);

看看我传递多部分和字符串参数的方式。希望对你有帮助!

原文由 android_griezmann 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于具有 inputStream 的用户,您可以使用 Multipart 上传 inputStream。

 @Multipart
@POST("pictures")
suspend fun uploadPicture(
        @Part part: MultipartBody.Part
): NetworkPicture

然后在您的存储库类中:

 suspend fun upload(inputStream: InputStream) {
   val part = MultipartBody.Part.createFormData(
         "pic", "myPic", RequestBody.create(
              MediaType.parse("image/*"),
              inputStream.readBytes()
          )
   )
   uploadPicture(part)
}

如果您的后端不允许多部分,您可以将输入流转换为字节并将字节数组作为请求正文发送,如下所示。

 // In your service
 @PUT
 suspend fun s3Upload(
     @Header("Content-Type") mime: String,
     @Url uploadUrl: String,
     @Body body: RequestBody
 )
// In your repository
val body = RequestBody.create(MediaType.parse("application/octet"), inputStream.readBytes())
networkService.s3Upload(mime, url, body)

要获得输入流,您可以执行类似的操作。

在您的片段或活动中,您需要创建一个返回 InputStream 的图像选择器。 InputStream 的优势在于它可以用于云上的文件,例如 google drive 和 Dropbox。

View.OnClickListeneronOptionsItemSelected 调用 pickImagesLauncher.launch("image/*") 。 (请参阅 活动结果 API )。

 private val pickImagesLauncher =
           registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
                uri?.let {
                    val stream = contentResolver.openInputStream(it)
                    itemViewModel.uploadPicture(stream)
                }
            }

override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)

      btn.setOnClickListener {
         pickImagesLauncher.launch("image/*")
     }
 }

原文由 Gilbert 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题