2016-10-16 8 views
0

こんにちは、私は、PHPサーバーにokhttp3のマルチパートリクエストを使用してjpgファイルをアップロードしようとしています。スクリプトは$ _FILES ["image1"]をチェックし、HTML形式から正しく動作します。以下のコードを使用すると、サーバーからのヌル応答が得られます。okhttp3 Null Responeアップロードファイル

ファイルアップロード部分を含む最後のaddFormDataPartを削除した場合、image1が設定されていないサーバーからの応答が返されます。

編集*私はブール値b = files.get(0).isFile()を発見しました。モバイルデバイスに保存されているファイルはfalse、Dropboxのファイルはtrueを返します。 Dropboxファイルは電話で正しい応答ファイルを返しますが、まだヌル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; 
} 

答えて

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();