android - retrofit-2 - 在将图像和音频上传到 aws 服务器时获取 403 响应代码
问题描述
@Multipart
@POST("http://ec2-18-216-193-78.us-east-
2.compute.amazonaws.com:3000//api/v1/snapNShare")
Call<SnapNShareResponse> sendUserReview(
@Header("Authoriozation") String token,
@Part("restaurantInfoId") String restaurantInfoId,
@Part MultipartBody.Part dishPicture,
@Part MultipartBody.Part audioReview,
@Part("textReview") String textReview,
@Part("rating") Integer rating);
ApiClient 如下: 在这里,我的项目与 Dagger 库集成。
@Singleton
public class ApiClient {
@Inject
ApiClient() {
}
private static Retrofit retrofitBaseURL = null;
private static Retrofit retrofitGOOGLEURL = null;
public static Retrofit getClient(Context context, String base_url) {
if (NetworkUtility.isNetworkAvailable(context)) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor)
.readTimeout(180, TimeUnit.SECONDS)
.connectTimeout(180, TimeUnit.SECONDS)
.build();
if (null == retrofitBaseURL && base_url.equals(WebConstants.BASE_URL)) {
retrofitBaseURL = new Retrofit.Builder()
.baseUrl(base_url)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
} else if (null == retrofitGOOGLEURL && base_url.equals(WebConstants.GOOGLE_BASE_URL)) {
retrofitGOOGLEURL = new Retrofit.Builder()
.baseUrl(base_url)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return base_url.equals(WebConstants.BASE_URL) ? retrofitBaseURL : retrofitGOOGLEURL;
} else {
SnapXToast.showLongToast(context, "");
return null;
}
}
}
这是我想将图像和音频文件上传到 aws 服务器的改造请求。改造功能如下:
public void sendReview(String restId, Uri image, Uri audio, String txtReview, Integer rating) {
if (NetworkUtility.isNetworkAvailable(mContext)) {
ApiHelper apiHelper = ApiClient.getClient(mContext, BASE_URL).create(ApiHelper.class);
String fileImagePath = getRealPathFromURIPath(image, mContext);
String fileAudioPath = getRealPathFromURIPath(audio, mContext);
File fileImg = new File(fileImagePath);
File fileAud = new File(fileAudioPath);
RequestBody mFileImage = RequestBody.create(MediaType.parse("*/*"), fileImg);//here I tried with media type "image/*"
RequestBody mFileAudio = RequestBody.create(MediaType.parse("*/*"), fileAud);//here I tried with media type "audio/*"
MultipartBody.Part imageUpload = MultipartBody.Part.createFormData("dishPicture", fileImg.getName(), mFileImage);
MultipartBody.Part audioUpload = MultipartBody.Part.createFormData("audioReview", fileAud.getName(), mFileAudio);
Call<SnapNShareResponse> snapXUserCall = apiHelper.sendUserReview(
utility.getAuthToken(mContext)
, restId, imageUpload, audioUpload, txtReview, rating);
snapXUserCall.enqueue(new Callback<SnapNShareResponse>() {
@Override
public void onResponse(Call<SnapNShareResponse> call,
Response<SnapNShareResponse> response) {
if (response.isSuccessful() && null != response.body()) {
SnapNShareResponse nShareResponse = response.body();
mReviewPresenter.response(SnapXResult.SUCCESS, nShareResponse);
SnapXToast.showToast(mContext,"yasss");
}
}
@Override
public void onFailure(Call<SnapNShareResponse> call, Throwable t) {
mReviewPresenter.response(SnapXResult.FAILURE, null);
}
});
} else {
mReviewPresenter.response(SnapXResult.NONETWORK, null);
}
}
//得到的响应是,
403 禁止http://ec2-18-216-193-78.us-east-2.compute.amazonaws.com:3000/api/v1/snapNShare (16878ms) X-Powered-By: Express Access-Control-Allow -来源:* 04-29 22:20:29.685 9724-14733/com.snapxeats D/OkHttp: Content-Type: application/json; charset=utf-8 内容长度:36 ETag:W/"24-9ze4gN/8B8Z0boWkFyxw9xuo9cA" 日期:2018 年 4 月 29 日星期日 16:50:30 GMT 连接:保持活动状态 04-29 22:20:29.690 9724-14733 /com.snapxeats D/OkHttp: {"message":"用户未通过身份验证"}
我需要在我的请求中单独添加“标题”部分吗?
同样在用于图像和音频的 logcat 中,我得到了这样的日志:
J�p?p�AN��ynnd���ʖ����V���g�8C#�凨4�h�7qL-辇~���� h41 BF�4�&���� T�\y�q�A�I��Rj�@НJ�����)2����RAo=ϐ.-������hH�$nGx�{��P�ռqM���� �<��5����l��sI�q�� �--cd1c8557-c8c3-498f-80ac-3434f9d19840 内容处置:表单数据;名称="音频评论"; 文件名="AUD_20180429_213143.mp3" 内容类型:/ 内容长度:4603
//图片也一样
对于“意外的 EOF”,我添加了“mPlayer.release();” 这消除了错误。任何人都可以帮我解决我缺少的部分吗?我检查了图像和音频的文件名;它们已成功保存到本地。并使用: // Retrofit implementation 'com.squareup.retrofit2:retrofit:2.2.0' implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
如果我需要添加有关我的查询的更多信息,请现在告诉我。谢谢 !!
解决方案
推荐阅读
- node.js - 错误:传入的参数必须是 12 字节的单个字符串或 ID 错误的 24 个十六进制字符的字符串
- javascript - 使用自定义滚动条模拟 Chrome 滚动条 - 禁用滚动条按钮上的悬停事件
- database - 用 Camel 在桌子上听插入
- python - 如何正确让 Flask 在 Heroku 的后台运行线程任务?
- python - 使用条件删除数据框中的行
- javascript - 如何在轮播中显示纵向和横向图像?
- r - 在 R 中使用 sapply 时如何保留列表的元素名称?
- sql-server - SQL 2014 等效于 string_agg 返回整数值
- sorting - 如何根据另一列计算唯一或最后一次出现的重复值?
- java - 继承枚举的子类:ClassNotDefinedError