1

マルチパートフォームデータの POST リクエストを実行するためのコードに取り組んでいます。私の場合は、パラメーターを使用してサーバーに画像をアップロードするだけです。これが私が今持っているものです:

マルチパート リクエストをトリガーするボタンがあり、ボタン OnClickListener に、新しいスレッドをスピンする次のコードがあります。

new Thread(new Runnable(){

@Override
public void run() {

    String photoUri = getPhotoUri();
    String url = getEndPointUrl();

    try {   

    NewPostRequest.postFile(url, photoUri, <Other Params...>);

    } catch (Exception e) {
        // Exception Handling           
    } 
}).start();

そして、基本的には以下のように、Apache Http ClientNewPostRequest.postFileを使用してリクエストを行うだけです。

HttpClient client = new DefaultHttpClient();

HttpPost post = new HttpPost(url);

MultipartEntityBuilder builder = MultipartEntityBuilder.create();    

builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

File file = new File(fileUri);

FileBody fb = new FileBody(file);

builder.addPart("file", fb);

builder.addTextBody("param", otherParam);

HttpEntity entity = builder.build();

post.setEntity(entity);

HttpResponse response = client.execute(post);      

最近の Android リリースでは、プログラムが UI スレッドで http リクエストを作成できないため、毎回新しいスレッドをスピンする必要があります。ただし、ランダムなスレッドをスピンして、上記のコードのように制御不能にすることには本当に反対です。Google Volleyライブラリを使用しようとしましたが、画像などの大きなデータ ファイルをアップロードする場合、これは一握りのツールではありません。

この通話をより管理しやすくするために何をすべきか疑問に思っていましたか?

=====更新=====

AsyncTaskを使用するように切り替えましたが、今のところ問題なく動作します。この質問を開いたままにして、より良いアプローチがあるかどうかを確認します。

4

3 に答える 3

-2

1) JSON オブジェクトとともに複数のファイルをアップロードするためのネイティブ Android プラグインを作成します。2) コンセプトはマルチパートファイルのアップロードです。3) オフライン モード同期用に作成します。4) Phonegap と Android ネイティブ コード。

ネイティブ Andorid コードの Javascript 呼び出し

alert(window.FilesUpload.sendFiles(JSON.stringify(jsonObj)));

以下は Android プラグイン (FilesUpload.java) です。

package com.yourpackagename.core;
import java.io.*;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.json.JSONArray;
import org.json.JSONObject;


public class FilesUpload
{
   public FilesUpload() {

   }

   public String sendFiles(String s) {       


       String responseBody = "";

       try
       {

          JSONObject jsonObject = new JSONObject(s);   

          int len_outer = jsonObject.getJSONArray("electricityExpenseManagement").getJSONObject(0).length();

          HttpClient httpclient = new DefaultHttpClient();

          HttpPost httppost = new HttpPost("http://yourservername.com/php_file_upload/file_upload2.php");

          MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);          

          StringBody elecExpObj = new StringBody(s);

          reqEntity.addPart("elecExpObj", elecExpObj);



           for(int i=0;i<len_outer;i++)
           {
               int bill_count = jsonObject.getJSONArray("electricityExpenseManagement").getJSONObject(i).getJSONArray("electricityExpenseBillInfoData").length();

               for(int j=0;j<bill_count;j++)
               {
                   String sourceFileUri = jsonObject.getJSONArray("electricityExpenseManagement").getJSONObject(0).getJSONArray("electricityExpenseBillInfoData").getJSONObject(j).getString("image_path");

                   String partName = jsonObject.getJSONArray("electricityExpenseManagement").getJSONObject(i).getJSONArray("electricityExpenseBillInfoData").getJSONObject(j).getString("image_base64_encode");                

                   FileBody bin = new FileBody(new File(sourceFileUri));

                   reqEntity.addPart(partName, bin);                   
               }
           }

           httppost.setEntity(reqEntity);          
           System.out.println("Requesting : " + httppost.getRequestLine());
           ResponseHandler<String> responseHandler = new BasicResponseHandler();
           responseBody = httpclient.execute(httppost, responseHandler);
           System.out.println("responseBody : " + responseBody);

           return responseBody;

      }
      catch (UnsupportedEncodingException e) {
         e.printStackTrace();
         return e.getMessage(); 
      }
      catch (ClientProtocolException e) {
         e.printStackTrace();
         return e.getMessage(); 
      }
      catch (IOException e) {
         e.printStackTrace();
         return e.getMessage(); 
      }
      catch(Exception e){
         e.printStackTrace();
         System.out.println("error");
         return e.getMessage();     
      }

   }
}

メインの Android Java ファイル (プラグイン クラスの定義)

package com.yourpackagename.core;

import android.os.Bundle;
import org.apache.cordova.*;

public class Waterhealth extends DroidGap
{

    private FilesUpload f;

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        // Set by <content src="index.html" /> in config.xml

        super.init();

        f = new FilesUpload();
        appView.addJavascriptInterface(f, "FilesUpload");


        super.loadUrl(Config.getStartUrl());
        super.loadUrl("file:///android_asset/elect_exp_FS/index.html");
    }
}

ファイルをアップロードするための PHP スクリプト (Web サービス)

<?php

if(isset($_REQUEST['elecExpObj']))
{        
        $obj= json_decode(stripslashes($_REQUEST['elecExpObj']));
        $len = count($obj->electricityExpenseManagement);
        $str = "";
        for($i=0;$i<$len;$i++)
        {
           $bill_count = count($obj->electricityExpenseManagement[$i]->electricityExpenseBillInfoData);
           for($j=0;$j<$bill_count;$j++)
           {
            $filePath = $obj->electricityExpenseManagement[$i]->electricityExpenseBillInfoData[$j]->image_base64_encode;


            if($_FILES[$filePath]['name'])
            {
              if(!$_FILES[$filePath]['error'])
          {
                 $new_file_name = $filePath . rand() . ".jpg"; //rename file    
                 move_uploaded_file($_FILES[$filePath]['tmp_name'], 'uploads/'.$new_file_name);
         $str .= 'Congratulations!  Your file was accepted.';                 
              }
            }
           }
        }
    echo $str;
}
else{
    echo "fail";
}
?>
于 2014-02-11T10:17:41.277 に答える