[英]Unable to upload picture from Android to java server
我一直在努力通過Android Retrofit + SpringMVC實現個人資料照片上傳功能。 Java服務器無法響應Retrofit API調用。 相關代碼段如下:
ApiInterface
@Multipart
@POST("user/profileImage")
Call<ResponseBody> uploadImage(@Part MultipartBody.Part image, @Part("name") RequestBody name);
uploadToServer
public void uploadToServer(){
//Get retrofit client
Retrofit retrofit = ApiClient.getClient();
//Get API interface
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
// Get image parts
MultipartBody.Part imageParts = bitmapToMultipart(imageBitmap);
//Get image name
RequestBody name = RequestBody.create(MediaType.parse("text/plain"), "ProfileImage");
//Call image upload API
Call<ResponseBody> call = apiInterface.uploadImage(imageParts,name);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
ResponseBody body = response.body();
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
}
});
}
bitmapToMultipart
public MultipartBody.Part bitmapToMultipart(Bitmap imageBitmap){
File file = null;
try {
//create a file to write bitmap data
file = new File(this.getCacheDir(), "imageBitmap");
file.createNewFile();
//Convert bitmap to byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
imageBitmap.compress(Bitmap.CompressFormat.JPEG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();
//write the bytes in file
FileOutputStream fos = new FileOutputStream(file);
fos.write(bitmapdata);
fos.flush();
fos.close();
}catch(IOException e){
e.printStackTrace();
}
RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("upload", file.getName(), reqFile);
return body;
}
Java SpringMVC控制器
@Controller
@RequestMapping("/user")
public class UserController{
@RequestMapping(value = "/profileImage", method = RequestMethod.POST)
public @ResponseBody String imageUploader(@RequestParam("image") MultipartFile image, @RequestBody RequestBody name)throws Exception{
return "";
}
}
問題是:請求甚至沒有到達java服務器。
在你的uploadToServer()函數中,媒體類型應該是“multipart / form-data”來代替字段名稱的“text / plain”...
//Get image name
RequestBody name = RequestBody.create(MediaType.parse("multipart/form-data"), "ProfileImage");
在bitmapToMultipart()函數中,媒體類型應為“multipart / form-data”。 (“image / *”也應該有用,但如果不是“multipart / form-data”肯定會有效)
Refer - 如何在Retrofit 2中上傳圖像文件
在你的spring控制器中,你應該用@RequestParam代替@Requestbody
@Controller
@RequestMapping("/user")
public class UserController{
@RequestMapping(value = "/profileImage", method = RequestMethod.POST)
public @ResponseBody String imageUploader(@RequestParam("image") MultipartFile image, @RequestParam String name)throws Exception{
return "";
}
}
請改變你的
RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
至
RequestBody reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
即你bitmapToMultipart函數應該是,像
public MultipartBody.Part bitmapToMultipart(Bitmap imageBitmap){
File file = null;
try {
//create a file to write bitmap data
file = new File(this.getCacheDir(), "imageBitmap");
file.createNewFile();
//Convert bitmap to byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
imageBitmap.compress(Bitmap.CompressFormat.JPEG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();
//write the bytes in file
FileOutputStream fos = new FileOutputStream(file);
fos.write(bitmapdata);
fos.flush();
fos.close();
}catch(IOException e){
e.printStackTrace();
}
RequestBody reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("upload", file.getName(), reqFile);
return body;
}
ApiInterface
@Multipart
@POST("user/profileImage")
Call<ResponseBody> uploadImage(@Part("image") MultipartBody.Part image, @Part("name") RequestBody name);
uploadToServer
public void uploadToServer(){
//Get retrofit client
Retrofit retrofit = ApiClient.getClient();
//Get API interface
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
// Get image parts
MultipartBody.Part imageParts = bitmapToMultipart(imageBitmap);
//Get image name
RequestBody name = RequestBody.create(MediaType.parse("text/plain"), "ProfileImage");
//Call image upload API
Call<ResponseBody> call = apiInterface.uploadImage(imageParts,name);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
ResponseBody body = response.body();
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
}
});
}
bitmapToMultipart
public MultipartBody.Part bitmapToMultipart(Bitmap imageBitmap){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
imageBitmap.compress(Bitmap.CompressFormat.JPEG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();
RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), bitmapdata);
MultipartBody.Part body = MultipartBody.Part.createFormData("upload", "name", reqFile);
return body;
}
Java SpringMVC控制器
@Controller
@RequestMapping("/user")
public class UserController{
@RequestMapping(value = "/profileImage", method = RequestMethod.POST)
public @ResponseBody String imageUploader(@RequestParam("image") MultipartFile image, @RequestParam String name)throws Exception{
return "";
}
}
imageBitmap.compress(Bitmap.CompressFormat.JPEG,80,bos);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.