Android Retrofit2.0 上传单张图片和多张图片

上传单张图片

	@Multipart
    @POST("invitation/upload")
    Flowable uploadImage(@Part MultipartBody.Part part);

然后进行调用

val file = File(selectList!![i].compressPath)
val requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file)
val body = MultipartBody.Part.createFormData("file", file.name, requestFile)  

getApiService().uploadImage(body )
	.observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(Schedulers.io())
    .subscribe()

上传多张图片

@Multipart
@POST("invitation/upload")
Flowable> uploadImages(@Part List list);  

然后进行调用

val list = ArrayList()

for(i in 0 until selectList!!.size){
    val file = File(selectList!![i].compressPath)
    val requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file)
    val body = MultipartBody.Part.createFormData("file$i", file.name, requestFile)
    list.add(body)
}

getApiService().uploadImages(list)
	.observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(Schedulers.io())
    .subscribe()

上传多张图片(方式二)

@Multipart
@POST("invitation/api/v1/upload/parkingPoint")
Flowable> uploadApplyParkPointImage5(@PartMap Map map);  

然后进行调用

val map = HashMap()
for(i in 0 until selectList!!.size){
    val file = File(selectList!![i].compressPath)
    val requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file)
    map["file$i\"; filename=\"" + file.name] = requestFile //注意这里的\",报文中如需要filename,需要进行拼接成,类似于name="file1"; filename="Luban_1556607036831.jpg"的形式
}

getApiService().uploadApplyParkPointImage5(map)
	.observeOn(AndroidSchedulers.mainThread())
	.subscribeOn(Schedulers.io())
	.subscribe()  

这里,上传多张图片,也可以使用
uploadImages(@Part MultipartBody.Part… files),可变参数,但需要提前知道图片个数
uploadImages(@Part MultipartBody.Part file1,@Part MultipartBody.Part file2),固定参数,需要提前知道图片个数

上传单张图片的报文

贴上报文日志以作参考

D/OkHttp: --> POST http://xxxx.xxxx.com/invitation/upload
D/OkHttp: Content-Type: multipart/form-data; boundary=9741fa91-558d-4b71-9117-e44139c9c02c
D/OkHttp: Content-Length: 117843
D/OkHttp: --9741fa91-558d-4b71-9117-e9c0144139cc
D/OkHttp: Content-Disposition: form-data; name="file"; filename="Luban_1556607508304.jpg"
D/OkHttp: Content-Type: multipart/form-data
D/OkHttp: Content-Length: 117616
D/OkHttp: ������JFIF����������������C��.....省略.....
D/OkHttp: �kr*�\�Y5&��d��&��:��D`ȋ���
D/OkHttp: --9741fa91-558d-4b71-9117-e9c0144139cc--
D/OkHttp: --> END POST (117843-byte body)
D/OkHttp: <-- 200 OK http://xxxx.xxxx.com/invitation/upload (186ms)
D/OkHttp: Server: openresty/1.13.6.2
D/OkHttp: Date: Tue, 30 Apr 2019 06:58:31 GMT
D/OkHttp: Content-Type: application/json;charset=UTF-8
D/OkHttp: Content-Length: 113
D/OkHttp: Connection: keep-alive
D/OkHttp: {"success":true,"msg":"上传成功","data":{"imgs":"parkingpoint_img/609c6d62-b76d-47f3-98fc-8663d25bae60.jpg"}}
D/OkHttp: <-- END HTTP (113-byte body)

上传多张图片的报文

贴上报文日志以作参考

D/OkHttp: --> POST http://xxxx.xxxx.com/invitation/upload
D/OkHttp: Content-Type: multipart/form-data; boundary=0a8b3a28-37b9-49be-a23e-e57470f29025
D/OkHttp: Content-Length: 234964
D/OkHttp: --0a8b3a28-37b9-49be-a23e-e590257470f1
D/OkHttp: Content-Disposition: form-data; name="file1"; filename="Luban_1556603633113.jpg"
D/OkHttp: Content-Type: multipart/form-data
D/OkHttp: Content-Length: 116938
D/OkHttp: ������JFIF����������������C��.....省略.....
D/OkHttp: --0a8b3a28-37b9-49be-a23e-e590257470f1
D/OkHttp: Content-Disposition: form-data; name="file2"; filename="Luban_1556603633644.jpg"
D/OkHttp: Content-Type: multipart/form-data
D/OkHttp: Content-Length: 117616
D/OkHttp: ������JFIF����������������C��.....省略.....
D/OkHttp: --0a8b3a28-37b9-49be-a23e-e590257470f1--
D/OkHttp: --> END POST (234964-byte body)
D/OkHttp: <-- 200 OK http://xxxx.xxxx.com/invitation/upload (1129ms)
D/OkHttp: Server: openresty/1.13.6.2
D/OkHttp: Date: Tue, 30 Apr 2019 05:53:57 GMT
D/OkHttp: Content-Type: application/json;charset=UTF-8
D/OkHttp: Content-Length: 113
D/OkHttp: Connection: keep-alive
D/OkHttp: {"success":true,"msg":"上传成功","data":{"imgs":"parkingpoint_img/6bab770d-f017-440a-88e4-bb80593a9a7d.jpg,parkingpoint_img/602fdd4b-e52a-4c98-9068-f12e1de7e55f.jpg"}}
D/OkHttp: <-- END HTTP (113-byte body)

可以看到,上传单张图片和多张图片的区别,就在于请求内容的个数

其他

【Android实战】----基于Retrofit实现多图片/文件、图文上传
Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传
Retrofit 2.0 超能实践(三),轻松实现多文件/图片上传/Json字符串/表单

你可能感兴趣的:(Android)