我正在使用Retrofit beta2而且我正在努力进行分段上传。我已经尝试了指定here的代码。我可能在这里错过了一些东西。
public interface SendMediaApiService {
@Multipart
@POST(/api/v1/messages)
Call<ApiResponse> upload(
@Header("Authorization") String token,
@Query("recipient_user_id") String userId,
@Query("message") String message,
@Part("name=\"photo\"; filename=\"selfie.jpg\" ") RequestBody file
);
}
private void upload() {
Retrofit retrofit = new Retrofit.Builder()
// do some stuffs here
File file = new File(filePath);
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
Call<ApiResponse> call = service.upload(token, userId, msg, requestBody);
}
当我卷曲
$ curl -v \
> -H "Authorization: Bearer TOKEN" \
> -F "photo=@/path/to/my/image.jpg" \
> http://domain.com/api/v1/messages?recipient_user_id=USER_ID&message=test
答案 0 :(得分:1)
也许,您可以删除 @Multipart
就像这样,
public static RequestBody createImageRequest(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
return new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addFormDataPart("file", "test.png", RequestBody.create(MediaType.parse("image/png"), byteArrayOutputStream.toByteArray())).build();
}
要创建RequestBody,您可以使用
var localData = [
{ location:'x', id:1, name:'A' },
{ location:'x', id:2, name:'B' },
{ location:'y', id:3, name:'C' },
{ location:'y', id:4, name:'D' },
{ location:'y', id:5, name:'E' },
{ location:'z', id:6, name:'F' },
],
i, j;
for(i = 0; i < localData.length; i++){
var l1 = localData[i].location;
localData[i].rowspan = 1;
for(j = i+1; j < localData.length; j++){
var l2 = localData[j].location;
if(l1 == l2){
localData[i].rowspan += 1;
}
else{
break;
}
}
i = j-1;
}
$scope.data = localData;
当我使用@Multipart请求时,图像文件将被放入请求正文中。没有@Multipart时,请求标题中的文件。
答案 1 :(得分:0)
小前言:我是链接博客文章的合着者。
您的代码看起来非常好。我们测试的代码与您的代码之间的一点区别是@Part() RequestBody file
声明。我们的代码没有指定文件:
@Part("myfile\"; filename=\"image.png\" ") RequestBody file
。
另一方面,在你的代码中是:
@Part("name=\"photo\"; filename=\"selfie.jpg\" ") RequestBody file
。
我建议从声明中删除name=\"
部分,然后重试。如果它没有帮助,你的错误是什么?
答案 2 :(得分:0)
我已成功使用Retroft上传了该图像文件。正如@peitek建议删除name=\"
部分解决了这个问题。
对于那些遇到这种困难的人来说,下面这段代码是有效的(至少对我而言)。这可以作为您的参考。
interface SendMediaApiService {
@Multipart
@POST(/api/v1/messages)
Call<ApiResponse> upload(
@Header("Authorization") String token,
@Query("recipient_user_id") String userId,
@Query("message") String message,
@PartMap Map<String, RequestBody> map
);
}
private void upload() {
Retrofit retrofit = new Retrofit.Builder()
// do some stuffs
Map<String, RequestBody> map = new HashMap<>();
File file = new File(path);
RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpeg"), file);
map.put("photo\"; filename=\"" + file.getName() + "\"", requestBody);
SendMediaApiService service = retrofit.create(SendMediaApiService.class);
Call<ApiResponse> call = service.upload(token, userId, msg, map);
call.enqueue(this);
}