将图像从 android(retrofit) 上传到 django 时出现问题

Problem with upload image from android(retrofit) to django

我想从 android 应用程序向 django 发送一张照片。我使用 django rest 框架作为后端。

当我 post 通过 postman 时,一切正常,我得到 201。但是当我尝试通过 android,我得到 400。问题出在哪里?预先感谢您的帮助

我的模特:

class Photo(models.Model):
    file = models.FileField(blank=False, null=False)

我的 django 视图:

    def post(self, request, *args, **kwargs):
        parser_classes = (FileUploadParser,)
        file_serializer = PhotoSerializer(data=request.data)
        if file_serializer.is_valid():
            file_serializer.save()
            return Response(file_serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

改装请求:

    @Headers("content-type: multipart/form-data;")
    @POST("upload")
    fun checkItem(@Body image: MultipartBody.Part): Observable<CheckDto>

这就是我从 android 应用发送照片的方式:

        val requestFile: RequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file)
        val body: MultipartBody.Part = MultipartBody.Part.createFormData("file", file.toString(), requestFile)

        val requestInterface = ApiClient.getClient().create(ApiInterface::class.java)
        myCompositeDisposable?.add(requestInterface.checkItem(body)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe({ result ->
                Log.d("Request", result.toString())
            }, { error ->
                error.printStackTrace()
            })
        )

您收到 400 Bad Request 是因为您尝试发送的数据。您的服务器接受 multipart/form-data 而您从 Android.

发送序列化对象

你现在可能会问这怎么可能?

嗯,当你使用Retrofit的@Body注解时,对象将使用Retrofit实例Converter序列化,结果将直接设置为请求体。

那么,解决方案是什么?

只需替换

中的代码
@Headers("content-type: multipart/form-data;")
@POST("upload")
fun checkItem(@Body image: MultipartBody.Part): Observable<CheckDto>

@Multipart
@POST("upload")
fun checkItem(@Part image: MultipartBody.Part): Observable<CheckDto>
  1. 删除 @Headers() 注释并在我们发送 multipart/form-data 时使用 @Multipart
  2. @Body替换为@Part

就是这样!