在Retrofit2上不上传完整文件

时间:2018-01-19 13:15:00

标签: android android-fragments retrofit2 multipartform-data

我有一个片段,我点击浏览按钮并打开文件管理器并选择文件并通过POST Retrofit2将其发送到服务器。

我收到成功消息200.该文件列在服务器中,但它不会打开。 大小为1kb 。所以,我认为文件没有正确上传。

以下是我的代码。

我哪里错了?

            File origFile = new File(PathHolder);
            String getDirPath = origFile.getParent();
            RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), getDirPath);
            multipartBody = MultipartBody.Part.createFormData("uploadFiles",origFile.getName(),requestFile);

            new UploadFileAsyncTask().execute();

异步任务是

protected notificationVO doInBackground(Void... params) {
                    notificationVO res;
                    WebserviceImpl webservices = new WebserviceImpl();
                    res = webservices.notifyAttachment(token,multipartBody, getContext());

                    Log.e("File","browse uploaded");
                    return res;
        }

阿比

 @Multipart
    @POST("upload")
    public Call<notificationVO>notifyAttachment(@Query("token")String token,
                                                @Part MultipartBody.Part attachFile);   // @Part MultipartBody.Part file

实施

 public notificationVO notifyAttachment(String token,MultipartBody.Part fileUri,final Context context){

        WebservicesApi mRestAPIWService = ApiUtilsForWS.getAPIService(context,);


        Call<notificationVO> call = mRestAPIWService.notifyAttachment(token,fileUri);
        try {

            Response<notificationVO> response = call.execute();
            if(response.isSuccessful())
            {
                Log.e(TAG,"Success."+response.code());
                return response.body();

            }
            else
            {

                Log.e(TAG,"Failed."+response.code());
                return null;
            }

        } catch (IOException e1) {
            e1.printStackTrace();
            return null;
        }

    }

1 个答案:

答案 0 :(得分:1)

使用如下所示的界面,在界面中删除@Query注释添加为@Part。

interface Service {
            @Multipart
            @POST("upload")
            Call<notificationVO> postImage(@Part MultipartBody.Part image, @Part("token") RequestBody name);
        }

检查您的文件路径是否有效,并检查文件大小以确认您是否从文件选择器中正确获取文件。

File origFile = new File(PathHolder);
int file_size = Integer.parseInt(String.valueOf(origFile .length()/1024));

如果一切正常,请尝试以下选项上传您的文件

RequestBody mFile = RequestBody.create(MediaType.parse("image/*"), file);
        MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), mFile);
        RequestBody token = RequestBody.create(MediaType.parse("text/plain"), file.getName());
// Service is interface name you can use your own interface name
        Service uploadImage = retrofit.create(Service.class);
        Call<notificationVO> fileUpload = uploadImage.postImage(fileToUpload, token);
        fileUpload.enqueue(new Callback<notificationVO>() {
            @Override
            public void onResponse(Call<notificationVO> call, Response<notificationVO> response) {

            }

            @Override
            public void onFailure(Call<notificationVO> call, Throwable t) {

            }
        });