如何使用 Retrofit 将图像从内部存储上传到服务器?
How to upload images from internal storage to server using Retrofit?
我正在尝试将两张图片从我的 android 设备的内部存储上传到 HTTP 服务器。
public interface ApiService {
...
@Multipart
@Headers("Content-Type: application/json")
@POST("signature/{id}")
Call<String> sendSignature(
@Header("Authorization") String authorization,
@Path("id") String id,
@Part("descrtipion") RequestBody description,
@Part MultipartBody.Part file1,
@Part MultipartBody.Part file2);
}
...
private void sendSignatures(){
RequestBody description = RequestBody.create(okhttp3.MultipartBody.FORM, getString(R.string.str_file_description));
File file2 = getFileStreamPath(SIGNATURE2_PATH);
RequestBody requestFile2 = RequestBody.create(MediaType.parse("image/png"), file2);
MultipartBody.Part body2 = MultipartBody.Part.createFormData("sign1", file2.getName(), requestFile2);
File file = getFileStreamPath(SIGNATURE_PATH);
RequestBody requestFile = RequestBody.create(MediaType.parse("image/png"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("sign2", file.getName(), requestFile);
Call<String> call = ApiFactory.getService().sendSignature(token, PARAMETER_ID, description, body2, body);
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) Log.d("myLogs", "Yes: " + response.body());
else Toast.makeText(MainActivity.this, ErrorUtils.errorMessage(response), Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Toast.makeText(MainActivity.this, t.toString(), Toast.LENGTH_LONG).show();
}
});
}
但是服务器 returns 错误 #500。同时Postman请求成功(#200).
请帮我解决这个问题:我在 java 代码中哪里出错了?
我找到了解决办法。特别是在这种情况下,有必要删除 header:
public interface ApiService {
...
@Multipart
@POST("signature/{id}")
Call<String> sendSignature(
@Header("Authorization") String authorization,
@Path("id") String id,
@Part("descrtipion") RequestBody description,
@Part MultipartBody.Part file1,
@Part MultipartBody.Part file2);
}
当我尝试通过 Postman 发送此请求并仅放入一个文件或两个文件,其中一个或两个文件的密钥错误时,即使令牌不正确,服务器也传递了 #500 错误。所以首先他们检查密钥和文件,然后是授权参数。我删除了 header,在这种情况下得到了成功的回应。
我正在尝试将两张图片从我的 android 设备的内部存储上传到 HTTP 服务器。
public interface ApiService {
...
@Multipart
@Headers("Content-Type: application/json")
@POST("signature/{id}")
Call<String> sendSignature(
@Header("Authorization") String authorization,
@Path("id") String id,
@Part("descrtipion") RequestBody description,
@Part MultipartBody.Part file1,
@Part MultipartBody.Part file2);
}
...
private void sendSignatures(){
RequestBody description = RequestBody.create(okhttp3.MultipartBody.FORM, getString(R.string.str_file_description));
File file2 = getFileStreamPath(SIGNATURE2_PATH);
RequestBody requestFile2 = RequestBody.create(MediaType.parse("image/png"), file2);
MultipartBody.Part body2 = MultipartBody.Part.createFormData("sign1", file2.getName(), requestFile2);
File file = getFileStreamPath(SIGNATURE_PATH);
RequestBody requestFile = RequestBody.create(MediaType.parse("image/png"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("sign2", file.getName(), requestFile);
Call<String> call = ApiFactory.getService().sendSignature(token, PARAMETER_ID, description, body2, body);
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) Log.d("myLogs", "Yes: " + response.body());
else Toast.makeText(MainActivity.this, ErrorUtils.errorMessage(response), Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Toast.makeText(MainActivity.this, t.toString(), Toast.LENGTH_LONG).show();
}
});
}
但是服务器 returns 错误 #500。同时Postman请求成功(#200).
请帮我解决这个问题:我在 java 代码中哪里出错了?
我找到了解决办法。特别是在这种情况下,有必要删除 header:
public interface ApiService {
...
@Multipart
@POST("signature/{id}")
Call<String> sendSignature(
@Header("Authorization") String authorization,
@Path("id") String id,
@Part("descrtipion") RequestBody description,
@Part MultipartBody.Part file1,
@Part MultipartBody.Part file2);
}
当我尝试通过 Postman 发送此请求并仅放入一个文件或两个文件,其中一个或两个文件的密钥错误时,即使令牌不正确,服务器也传递了 #500 错误。所以首先他们检查密钥和文件,然后是授权参数。我删除了 header,在这种情况下得到了成功的回应。