我正在尝试通过POST多部分请求上传图像,这应该具有如下结构:
----------------------------- 219391268715340 内容处理:表格数据;命名="照片[]&#34 ;;文件名=" DSCF0157-Laptop.JPG" 内容类型:image / jpeg
(字节数据)
我的代码:
MediaType mediaType = MediaType.parse("image/jpeg");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] byteArray = stream.toByteArray();
RequestBody file=RequestBody.create(mediaType, byteArray);
map.put("form-data; name=\"photos[]\"; filename=\""+filename+".jpg",file);
我使用地图是因为@PartMap注释 - 我想上传多个文件。我的服务器返回http代码200 - 但没有上传文件。 Api调用已经过测试 - 如果我们的Web应用程序使用它,它可以正常工作。知道我做错了什么
答案 0 :(得分:2)
如果您想使用Retrofit 2在请求中上传许多文件,可以在下面的问题中参考我的回答
Retrofit - Multipart request: Required MultipartFile parameter 'file' is not present
经过一些修改:
<强> WebAPIService.java:强>
@Multipart
@POST("/api/fileupload")
Call<ResponseBody> postFiles(@Part List<MultipartBody.Part> fileList);
<强> FileActivity.java:强>
...
List<MultipartBody.Part> fileList = new ArrayList<>();
for (int i = 0; i < 2; i++){
fileList.add(body);
}
Call<ResponseBody> call = service.postFiles(fileList);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call,
Response<ResponseBody> response) {
Log.i(LOG_TAG, "success");
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e(LOG_TAG, t.getMessage());
}
});
当然,使用上面的代码,实际上,同一个文件(正文)将作为2个部分上传到请求中。因此,在Web服务器中,您将拥有2个具有相同内容的文件,您可以使用许多不同的文件自定义fileList
:)
希望它有所帮助!
答案 1 :(得分:0)
也许你可以这样做。
<强> YourAPIService 强>
@Multipart
@POST("api/image/upload")
Call<ImageUploadResponse> uploadImage(@Part("photos") List<RequestBody> imageFiles);
YourActivity
//prepare request body
List<RequestBody> images = new ArrayList<>();
for (int i = 0; i < filePath.size(); i++){
RequestBody file = RequestBody.create(MediaType.parse("image/*"), filePath.get(i);
images.add(file);
}
//call api
Call<ImageUploadResponse> call = imageUploadService.uploadImage(images);
call.enqueue(new Callback<ImageUploadResponse>() {
@Override
public void onResponse(Call<ImageUploadResponse> call,
Response<ImageUploadResponse> response) {
}
@Override
public void onFailure(Call<ImageUploadResponse> call, Throwable t) {
}
});