将图像从 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>
- 删除
@Headers()
注释并在我们发送 multipart/form-data
时使用 @Multipart
。
- 将
@Body
替换为@Part
就是这样!
我想从 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>
- 删除
@Headers()
注释并在我们发送multipart/form-data
时使用@Multipart
。 - 将
@Body
替换为@Part
就是这样!