代码之家  ›  专栏  ›  技术社区  ›  Asset Bekbossynov

使用改装将图像上载到服务器

  •  0
  • Asset Bekbossynov  · 技术社区  · 7 年前

    我想使用下面的代码使用其uri将图像/文件上载到服务器

    try {
    
                        String descriptionString = "Sample description";
                        RequestBody description = RequestBody.create(MultipartBody.FORM, descriptionString);
    
                        File file = new File(path);
    
                        String extension = MimeTypeMap.getFileExtensionFromUrl(uri.toString());
    
                        if (extension != null) {
    
                            String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
                            RequestBody requestFile = RequestBody.create(MediaType.parse(type), file);
    
                            MultipartBody.Part body2 = MultipartBody.Part.createFormData("avatar", file.getName(), new FileRequestBody(file, extension));
    
                            Response<ResponseBody> response = ApiCaller.getProfileAPI().requestingUploadProfilePhoto("Bearer " + AuthenticationProvider.getInstance().token.token,
                                    "form-data; name=avatar; filename=\"" + file.getName() + "\"",
                                    ProfileProvider.getInstance().parsedProfile.profileId,
                                    description,
                                    body2).execute();
                            if (response.isSuccessful()){
                                Logger.msg("Photo", ": uploaded successfully " + uri);
                            }else{
                                Logger.msg("Photo", ": uploaded successfully none" + uri + response.errorBody().string());
                            }
                        }else{
                            Logger.msg("Photo", ":extension error");
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    

    我为该请求提供的API服务

     @Multipart
    @POST("v1/avatar/profiles/{profileId}/upload")
    Call<ResponseBody> requestingUploadProfilePhoto(@Header("Authorization") String authHeader,
                                                    @Header("Content-Disposition") String content_type,
                                                    @Path("profileId") String profileId,
                                                    @Part("description") RequestBody description,
                                                    @Part MultipartBody.Part file);
    

    因此,我的回答并不成功。API向我返回内部服务器错误状态500,但我知道服务器运行良好(我在其他应用程序中测试了它)。此外,文件uri也可以。我是新来的,所以有人能发现我的错误并详细解释为什么它是错误的。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Asset Bekbossynov    7 年前

    如果有人发现它有用,那么这里的第一个参数“name”中就有错误(在我的情况下,根据服务器,它应该是“file”,而不是“avatar”)

    MultipartBody.Part body2 = MultipartBody.Part.createFormData("avatar", file.getName(), new FileRequestBody(file, extension));
    
    Response<ResponseBody> response = ApiCaller.getProfileAPI().requestingUploadProfilePhoto("Bearer " + AuthenticationProvider.getInstance().token.token,
                                ProfileProvider.getInstance().parsedProfile.profileId,
                                body2).execute();
                        if (response.isSuccessful()){
                            Logger.msg("Photo", ": uploaded successfully " + uri);
                        }else{
                            Logger.msg("Photo", ": uploaded successfully none" + uri + response.errorBody().string());
                        }
    

    所以,改变它,去掉所有不必要的东西就足够了。 当然,还有必要根据参数更改服务文件。我对它关注不够,因为在教程中没有提到它作为一些重要参数。

        2
  •  0
  •   Arshad    7 年前

    您可以使用convert your image to file并创建一个多部分请求,如下所示

        String fileName = "myFile";
        RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
        MultipartBody.Part body = MultipartBody.Part.createFormData("image", fileName, reqFile);
    

    要将图像转换为文件,请使用以下函数

        public static File convertBitmapToFile(Context mContext, Bitmap bitmap) {
            try {
                File f = new File(mContext.getCacheDir(), "image");
                f.createNewFile();
    
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 60 /*ignored for PNG*/, bos);
                byte[] bitmapdata = bos.toByteArray();
    
    
                FileOutputStream fos = new FileOutputStream(f);
                fos.write(bitmapdata);
                fos.flush();
                fos.close();
                return compressImageFile(mContext, f);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    

    改装Api定义

        @Multipart
        @POST("/upload/image")
        Call<ResponseBody> uploadImage(@Part MultipartBody.Part image);
    

    对于压缩机功能,使用以下代码

    将此添加到gradle中

    compile 'id.zelory:compressor:2.1.0'
    
    
    
    public static File compressImageFile(Context mContext, File file) {
            try {
                return new Compressor(mContext).compressToFile(file);
            } catch (IOException e) {
                e.printStackTrace();
                return file;
            }
        }