2016-04-30 17 views
0

3つのファイルを格納するSqliteテーブルがあり、テーブルから読み込むときにはうまく動作しますが、サーバーにアップロードするときは最後のファイルをアップロードします3回。私のコードで何が間違っているのか分かりません。私にこの問題の解決策を教えてください。Androidでサーバーにファイルをアップロードする - 最後のファイルをアップロードする

List<MediaFiles> mediaFiles = mfh.getAllFiles(); 
     for (MediaFiles mf : mediaFiles) { 
      filePath = mf.getFile(); 
      lat = Double.parseDouble(mf.getGeolat()); 
      longi = Double.parseDouble(mf.getGeolng()); 
      String log = "Id: " + mf.getId() + " ,File: " + mf.getFile() + " ,latitued: " + mf.getGeolat() + " ,longitued: " + mf.getGeolng(); 
      Log.d("File Table Row: ", log); 
      new UploadFileToServerMain().execute(); 
     } 

そして、これは、アップローダクラスです:

private class UploadFileToServerMain extends AsyncTask<Void, Integer, String> { 
    @Override 
    protected void onPreExecute() { 
     // setting progress bar to zero 
     //progressBar.setProgress(0); 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 

    } 

    @Override 
    protected String doInBackground(Void... params) { 
     return uploadFile(); 
    } 

    @SuppressWarnings("deprecation") 
    private String uploadFile() { 

     String responseString = null; 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(global.getURL()+"fileUpload.php"); 

     try { 
      AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
        new AndroidMultiPartEntity.ProgressListener() { 

         @Override 
         public void transferred(long num) { 
          publishProgress((int) ((num/(float) totalSize) * 100)); 
         } 
        }); 

      File sourceFile = new File(filePath); 

      // Adding file data to http body 
      entity.addPart("latitued", new StringBody(lat+"")); 
      entity.addPart("longitued", new StringBody(longi+"")); 
      entity.addPart("image", new FileBody(sourceFile)); 
      entity.addPart("token",new StringBody(global.getMyToken())); 

      totalSize = entity.getContentLength(); 
      httppost.setEntity(entity); 

      // Making server call 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity r_entity = response.getEntity(); 

      int statusCode = response.getStatusLine().getStatusCode(); 
      if (statusCode == 200) { 
       // Server response 
       responseString = EntityUtils.toString(r_entity); 
      } else { 
       responseString = "Error occurred! Http Status Code: " 
         + statusCode; 
      } 

     } catch (ClientProtocolException e) { 
      responseString = e.toString(); 
     } catch (IOException e) { 
      responseString = e.toString(); 
     } 

     return responseString; 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     Log.e(TAG, "Response from server: " + result); 
     // showing the server response in an alert dialog 
     //showAlert(result); 
     super.onPostExecute(result); 
    } 

} 

Logcat: enter image description here

+0

を作成しますか? 3つのファイルすべてをループしますが、最後のファイルパスはfilePath変数にのみ格納します。 AsyncTasksを起動すると、同じfilePathのみが使用されます。そこにデバッグするか、ログに記録されているかどうかを確認してください。 編集:filePathが同じ場合は、filePathをパラメータとしてAsyncTaskに送信し、そこで使用する必要があります。 –

+0

filePathは自分のアクティビティの最上位に定義されています –

+0

filePathをパラメータとしてUploadFileToServerMainに渡す方法は? –

答えて

0

最後に、私は解決策を得た(これは私がActivityから呼び出す方法です感謝

に感謝パラメータをAsyncTaskクラスに渡す。

List<MediaFiles> mediaFiles = mfh.getAllFiles(); 
    for (MediaFiles mf : mediaFiles) { 
     lat = Double.parseDouble(mf.getGeolat()); 
     longi = Double.parseDouble(mf.getGeolng()); 
     String log = "Id: " + mf.getId() + " ,File: " + mf.getFile() + " ,latitued: " + mf.getGeolat() + " ,longitued: " + mf.getGeolng(); 
     Log.d("File Table Row: ", log); 
     new UploadFileToServerMain(mf.getFile()).execute(); 
    } 

コンストラクタアップローダークラスにAsyncTaskからあなたfilePathに変数を取得しない

private class UploadFileToServerMain extends AsyncTask<Void, Integer, String> { 

private String path = null; 
public UploadFileToServerMain(String path){ 
     this.path = path; 
} 

@SuppressWarnings("deprecation") 
private String uploadFile() { 

    String responseString = null; 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(global.getURL()+"fileUpload.php"); 

    try { 
     AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
       new AndroidMultiPartEntity.ProgressListener() { 

        @Override 
        public void transferred(long num) { 
         publishProgress((int) ((num/(float) totalSize) * 100)); 
        } 
       }); 

     File sourceFile = new File(path); 

     // Adding file data to http body 
     entity.addPart("latitued", new StringBody(lat+"")); 
     entity.addPart("longitued", new StringBody(longi+"")); 
     entity.addPart("image", new FileBody(sourceFile)); 
     entity.addPart("token",new StringBody(global.getMyToken())); 

     totalSize = entity.getContentLength(); 
     httppost.setEntity(entity); 

     // Making server call 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity r_entity = response.getEntity(); 

     int statusCode = response.getStatusLine().getStatusCode(); 
     if (statusCode == 200) { 
      // Server response 
      responseString = EntityUtils.toString(r_entity); 
     } else { 
      responseString = "Error occurred! Http Status Code: " 
        + statusCode; 
     } 

    } catch (ClientProtocolException e) { 
     responseString = e.toString(); 
    } catch (IOException e) { 
     responseString = e.toString(); 
    } 

    return responseString; 

} 

} 
関連する問題