okhttp3 Null Respone上传文件

时间:2016-10-16 14:41:40

标签: php android okhttp3

您好我正在尝试使用okhttp3的多部分请求将jpg文件上传到php服务器。该脚本检查$ _FILES [“image1”]并从html表单中正常工作。使用以下代码时,我从服务器获得空响应。

如果我删除包含文件上传部分的最后一个addFormDataPart,我从服务器得到一个没有设置image1的响应。

编辑*我发现boolean b = files.get(0).isFile();对于存储在我的移动设备上的文件,返回false,对于dropbox上的文件,则返回true。 Dropbox文件在手机上返回正确的响应文件仍然返回null http响应。有什么建议吗?

public AsyncHttpPost(String id, String password, List<File> files, OnTaskComplete listener ) {
    MediaType MEDIA_TYPE_JPG = MediaType.parse("image/jpg");
    MultipartBody.Builder  builder = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart(ResponseDTO.TAG_ID, String.valueOf(id))
            .addFormDataPart(ResponseDTO.TAG_PASSWORD, password)
            .addFormDataPart("image1", "Test.jpg", RequestBody.create(MEDIA_TYPE_JPG, files.get(0)));

    mRequestBody = builder.build();
    mListener = listener;
}

public AsyncHttpPost() {
}

public void setListener(OnTaskComplete listener){
    mListener = listener;
}

@Override
protected String doInBackground(String... params) {
    String result = "";

    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
            .url(params[0])
            .post(mRequestBody)
            .build();



    Response response  = null;
    try {
        response = client.newCall(request).execute();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        if(response != null) {
            result = response.body().string();
        }else{
            result = "null";
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

1 个答案:

答案 0 :(得分:0)

使用URI路径时isFile()返回false。所以我不得不使用路径创建文件,如下所示。这会导致几秒钟后出现空响应,因此我还更新了我的http客户端的超时值

File f = new File(uri.getPath()); //didnt work
File f = new File("/storage/emulated/0/DCIM/Camera/Test.jpg");

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(300, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();