HM8*_*M88 7 android file-upload retrofit retrofit2
我正在使用 Retrofit v.2.2.0 将图片上传到我的服务器,但服务器返回一个空值,表明没有上传任何图像。日志显示图像已上传,上传时文件名正确。但它在邮递员中工作可能是什么问题?
上传配置文件图片.java
public class UploadProfilePicture extends ContextWrapper {
private GetOnUpload onUpload;
private File imageFile,filesDir,file;
private Uri fileUri;
private String profilePic = "profile_pic";
private String fileName;
private ParcelFileDescriptor parcelFileDescriptor;
private FileDescriptor fileDescriptor;
private Bitmap profileImage;
private OutputStream os;
private OkHttpLogClientAPI okHttpLogClientAPI;
private GetOnUpload mInterfaceService;
public UploadProfilePicture(Context base) {
super(base);
okHttpLogClientAPI = new OkHttpLogClientAPI(getBaseContext());
mInterfaceService = okHttpLogClientAPI.logger().create(GetOnUpload.class);
}
public void uploadPic(Uri fileUri,String fileName, final OnSetUploadProfilePic setOnUpload) {
//Build Req estBodies for the map object and a MultipartBody.Part to encapsulate the prof_pic_drawer
this.fileUri = fileUri;
this.fileName = fileName;
try {
getBitmapFromUri();
} catch (IOException e) {
e.printStackTrace();
}
file = persistImage();
RequestBody finalRequestBody = builder.build();
RequestBody requestFile =
RequestBody.create(MediaType.parse("multipart/form-data"), getBytesFromBitmap(profileImage));
// MultipartBody.Part is used to send also the actual file name
MultipartBody.Part body =
MultipartBody.Part.createFormData("file", "avatar.jpg", requestFile);
Call<ResponseUserModel> call = mInterfaceService.upload(body);
call.enqueue(new Callback<ResponseUserModel>() {
@Override
public void onResponse(Call<Response> call, Response<Response> response) {
if (response.isSuccessful()) {
setOnUpload.uploadMessage(response.body());
} else {
Toast.makeText(getBaseContext(), getString(R.string.failed_to_upload), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<Response> call, Throwable t) {
Toast.makeText(getBaseContext(), getString(R.string.failed_to_upload), Toast.LENGTH_SHORT).show();
}
});
}
}
public static byte[] getBytesFromBitmap(Bitmap bitmap) {
if (bitmap!=null) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream);
return stream.toByteArray();
}
return null;
}
private MultipartBody.Part prepareFilePart() {
//TODO: Use FileUtils to get the actual file by uri
try {
getBitmapFromUri();
file = persistImage();
} catch (IOException e) {
e.printStackTrace();
}
try {
RequestBody requestFile = RequestBody.create(
MediaType.parse(getBaseContext().getContentResolver().getType(fileUri)), file);
return MultipartBody.Part.createFormData("file", file.getName(), requestFile);
} catch (NullPointerException e) {
Toast.makeText(getBaseContext(), "" + e.getMessage(), Toast.LENGTH_SHORT).show();
return null;
}
}
private RequestBody createPartFromString(String descriptionString) {
return RequestBody.create(MultipartBody.FORM, descriptionString);
}
private void getBitmapFromUri() throws IOException {
profileImage = MediaStore.Images.Media.getBitmap(this.getContentResolver(), fileUri);
}
private File persistImage() {
filesDir = getFilesDir();
imageFile = new File(filesDir, fileName + ".jpg");
OutputStream os;
try {
os = new FileOutputStream(imageFile);
profileImage.compress(Bitmap.CompressFormat.JPEG, 70, os);
os.flush();
os.close();
} catch (Exception e) {
Log.e(getClass().getSimpleName(), "Error writing bitmap", e);
}
return imageFile;
}}
Run Code Online (Sandbox Code Playgroud)
获取上传文件
public interface GetOnUpload {
@Multipart
@POST(Constants.UPLOAD_URL)
Call<Response> upload(@Part MultipartBody.Part file);}
Run Code Online (Sandbox Code Playgroud)
日志
http://local.com/api/v1/avatarhttp/1.1 11-14 18:40:02.742 8851-9593/com.local.test D/OkHttp: Content-Type: multipart/form-data; 边界=d43da080-f2c3-4743-8cfd-9526cc0bd2f7 11-14 18:40:02.742 8851-9593/com.local.test D/OkHttp: Content-Length: 12424 11-144:05918187 .local.test D/OkHttp: --d43da080-f2c3-4743-8cfd-9526cc0bd2f7 11-14 18:40:02.743 8851-9593/com.local.test D/OkHttp: Content-Disposition: form-data; 名称=“文件”;filename="avatar.jpg" 11-14 18:40:02.743 8851-9593/com.local.test D/OkHttp: Content-Type: multipart/form-data 11-14 18:40:02.743 8851-9593/com .local.test D/OkHttp: Content-Length: 12201 11-14 18:40:02.743 8851-9593/com.local.test D/OkHttp: 11-14 18:40:02.744 8851-9593/com.local.测试 D/OkHttp: --d43da080-f2c3-4743-8cfd-9526cc0bd2f7-- 11-14 18:40:02.744 8851-9593/com.local.test D/OkHttp: --> END POST-byte (12424)
11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp: <-- 200 OK http://local.com/api/v1/avatar (587ms) 11-14 18:40:03.332 8851-9593/com.local.test D/Okhttp:服务器:nginx/1.10.3 (Ubuntu) 11-14 18:40:03.332 8851-9593/com.local。 test D/OkHttp: Content-Type: application/json 11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp: Transfer-Encoding: chunked 11-14 18:40:03.332 8851-9593/ com.local.test D/OkHttp:连接:保持活动 11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp:缓存控制:无缓存,私有 11-14 18:40 :03.332 8851-9593/com.local.test D/OkHttp: 日期: 2017 年 11 月 14 日星期二 15:40:03 GMT 11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp: X -RateLimit-Limit: 60 11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp: X-RateLimit-Remaining: 59 11-14 18:40:03.333 8851-9593/ test D/OkHttp: {"user":"Failed","status":"图片文件未上传"}
小智 4
这个例子对我有用
//My data manager
public void doUpload(
Context context,
String url) {
Uri uri = Uri.parse(url);
File file = new File(getPath(context, uri));
RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("imageParameterName", file.getName(), reqFile);
uploadService(body)
}
//REST service
@Multipart
@POST("upload.aspx")
Call<DefaultDTO> uploadService(@Part MultipartBody.Part image);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8414 次 |
| 最近记录: |