Retrofit 2 中的图片上传问题
Image Upload issue in Retrofit 2
我是 android 的新手,我正在尝试从我的设备上传图片,但在上传时遇到问题,而且 Api 没有任何回应。在邮递员中,我已经上传了图像,它工作正常,但我如何在 android 工作室中实现这一点。下面是我的主要java。请帮我解决问题
public class TheProfileActivity extends AppCompatActivity {
Button buttonUpload;
UserNumber userNumber;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_the_profile);
buttonUpload = findViewById(R.id.btn_upload_file);
userNumber = ApiNetClient.getRetrofits().create(UserNumber.class);
buttonUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent galleryIntent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && data != null) {
Uri uri = data.getData();
uploadFile(uri);
}
}
private void uploadFile(Uri uriFile) {
File file = new File(getRealPath(uriFile));
RequestBody requestBody = RequestBody.create(MediaType.parse(getContentResolver().getType(uriFile)), file);
MultipartBody.Part profileImage = MultipartBody.Part.createFormData("image",file.getName(),requestBody);
Call<ResponseImages> call = userNumber.UploadImage(profileImage);
call.enqueue(new Callback<ResponseImages>() {
@Override
public void onResponse(Call<ResponseImages> call, Response<ResponseImages> response) {
ResponseImages response1= response.body();
if (response.isSuccessful()){
Gson gson = new Gson();
String successResponse = gson.toJson(response.body());
Toast.makeText(TheProfileActivity.this, successResponse, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(TheProfileActivity.this, "no resp", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseImages> call, Throwable t) {
}
});
}
private String getRealPath(Uri contentUri){
String[] proj = {MediaStore.Images.Media.DATA};
CursorLoader cursorLoader = new CursorLoader(this,contentUri,proj,null,null,null);
Cursor cursor = cursorLoader.loadInBackground();
assert cursor != null;
int columIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String result = cursor.getString(columIndex);
cursor.close();
return result;
}
}
这是接口 class
@Multipart
@POST("Upload_Image")
Call<ResponseImages> UploadImage(
@Part MultipartBody.Part image);
这样试试
@Multipart
@POST("Upload_Image")
Call<ResponseBody> uploadImage(@Part("file\"; fileName=\"myFile.png\" ")RequestBody requestBodyFile, @Part("image") RequestBody requestBodyJson);
File imgFile = new File("YOUR IMAGE FILE PATH");
RequestBody requestBodyFile = RequestBody.create(MediaType.parse("image/*"), imgFile);
RequestBody requestBodyJson = RequestBody.create(MediaType.parse("text/plain"),
retrofitClient.getJsonObject(uploadRequest));
Call<ResponseBody> uploadBundle = uploadImpl.uploadImage(requestBodyFile, requestBodyJson);
Response<BaseResponse> response = uploadBundle.execute();
试试这个也许有用:
尝试从 uri 获取输入流,而不是获取文件路径:
InputStream is = getContentResolver().openInputStream(Urifile);
现在将此流转换为 bytearray
并上传到服务器
我是 android 的新手,我正在尝试从我的设备上传图片,但在上传时遇到问题,而且 Api 没有任何回应。在邮递员中,我已经上传了图像,它工作正常,但我如何在 android 工作室中实现这一点。下面是我的主要java。请帮我解决问题
public class TheProfileActivity extends AppCompatActivity {
Button buttonUpload;
UserNumber userNumber;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_the_profile);
buttonUpload = findViewById(R.id.btn_upload_file);
userNumber = ApiNetClient.getRetrofits().create(UserNumber.class);
buttonUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent galleryIntent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && data != null) {
Uri uri = data.getData();
uploadFile(uri);
}
}
private void uploadFile(Uri uriFile) {
File file = new File(getRealPath(uriFile));
RequestBody requestBody = RequestBody.create(MediaType.parse(getContentResolver().getType(uriFile)), file);
MultipartBody.Part profileImage = MultipartBody.Part.createFormData("image",file.getName(),requestBody);
Call<ResponseImages> call = userNumber.UploadImage(profileImage);
call.enqueue(new Callback<ResponseImages>() {
@Override
public void onResponse(Call<ResponseImages> call, Response<ResponseImages> response) {
ResponseImages response1= response.body();
if (response.isSuccessful()){
Gson gson = new Gson();
String successResponse = gson.toJson(response.body());
Toast.makeText(TheProfileActivity.this, successResponse, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(TheProfileActivity.this, "no resp", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseImages> call, Throwable t) {
}
});
}
private String getRealPath(Uri contentUri){
String[] proj = {MediaStore.Images.Media.DATA};
CursorLoader cursorLoader = new CursorLoader(this,contentUri,proj,null,null,null);
Cursor cursor = cursorLoader.loadInBackground();
assert cursor != null;
int columIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String result = cursor.getString(columIndex);
cursor.close();
return result;
}
}
这是接口 class
@Multipart
@POST("Upload_Image")
Call<ResponseImages> UploadImage(
@Part MultipartBody.Part image);
这样试试
@Multipart
@POST("Upload_Image")
Call<ResponseBody> uploadImage(@Part("file\"; fileName=\"myFile.png\" ")RequestBody requestBodyFile, @Part("image") RequestBody requestBodyJson);
File imgFile = new File("YOUR IMAGE FILE PATH");
RequestBody requestBodyFile = RequestBody.create(MediaType.parse("image/*"), imgFile);
RequestBody requestBodyJson = RequestBody.create(MediaType.parse("text/plain"),
retrofitClient.getJsonObject(uploadRequest));
Call<ResponseBody> uploadBundle = uploadImpl.uploadImage(requestBodyFile, requestBodyJson);
Response<BaseResponse> response = uploadBundle.execute();
试试这个也许有用:
尝试从 uri 获取输入流,而不是获取文件路径:
InputStream is = getContentResolver().openInputStream(Urifile);
现在将此流转换为 bytearray
并上传到服务器