改造上传图片

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)