Retrofit 2文件上传不附加文件

时间:2016-12-30 17:21:03

标签: android file-upload asp.net-core retrofit

我已经使用asp核心在服务器上编写了一个上传操作,我已经通过ARC对其进行了测试并收到了文件。

Correctness Evidence

但是当我尝试使用Retrofit上传图片时,没有任何内容可以发送。即使表格是空的:

Fault Occured

接口的源代码在这里。界面:

public interface QuestionWebService {

    @Multipart
    @POST("questionapi/uploadfiles")
    Call<ResponseBody> uploadSync(@Part("fileUpload") RequestBody paramTypedFile);
}

以及异步任务中的用法:

@Override
    protected Boolean doInBackground(String... params) {


            File fileToSend = new File(params[0]);

//            fileToSend.renameTo()

            RequestBody typedFile = RequestBody.create(MediaType.parse("image/*"), fileToSend);
            Response response = restClient.getQuestionService().uploadSync(typedFile).execute();

            if (response == null){
                Log.e(TAG, "success send server - failed");
                return  false;
            }
            if (response.isSuccessful()) {
                Log.e(TAG, "success send server - 200 status");
            } else {
                Log.e(TAG, "success send server - fail status - " + response.toString());
            }

        } catch (Exception e) {
            //throw new RuntimeException(e);
            Log.e(TAG,e.getMessage().toString());
            return false;
        }

        return true;
    }

关于我应该尝试什么的任何想法?我哪里错了。 TG

1 个答案:

答案 0 :(得分:3)

最后我找到了解决方案。我不知道为什么这段代码不起作用的原因,但正如this link所说,我改变了:

public interface QuestionWebService {

    @Multipart
    @POST("questionapi/uploadfiles")
    Call<ResponseBody> uploadSync(@Part("fileUpload") RequestBody paramTypedFile);
}

到这一个:

public interface QuestionWebService {

    @Multipart
    @POST("questionapi/uploadfiles")
    Call<ResponseBody> uploadSync(@Part("UserId") RequestBody UserId, @Part("answer") RequestBody answer, @Part MultipartBody.Part file);
}

及其用法:

RequestBody typedFile = RequestBody.create(MediaType.parse("image/*"), fileToSend);
            Response response = restClient.getQuestionService().uploadSync(typedFile).execute();

到这一个:

// create RequestBody instance from file
            RequestBody requestFile =
                    RequestBody.create(MediaType.parse("multipart/form-data"), fileToSend);

            // MultipartBody.Part is used to send also the actual file name
            MultipartBody.Part body =
                    MultipartBody.Part.createFormData("fileUpload", fileToSend.getName(), requestFile);
RequestBody userId =
                    RequestBody.create(
                            MediaType.parse("multipart/form-data"), userIdString);

            // add another part within the multipart request
            String answerString = "hello, this is answer speaking";
            RequestBody answer =
                    RequestBody.create(
                            MediaType.parse("multipart/form-data"), answerString);

            Response response = restClient.getQuestionService().uploadSync(userId, answer, body).execute();

现在一切顺利! 我希望其他人遇到同样的问题。

现在服务器上的数据是一个包含2个字段的表单,UserId和Answer,以及一个名为fileUpload的文件。 TG