2

ユーザーは、カメラを介して Android 側で 5 ~ 6 枚の写真を撮ることができます。そこで、ACTION_IMAGE_CAPTURE を使用しました。onActivityResult では、カメラが撮影した画像のビットマップを収集するためにこれを行います。最初に撮影した写真と 2 番目に撮影した写真を以下のように仮定します。

if(requestCode == 1)
{
    bitMap1 = (Bitmap)extras.get("data");
    imageView1.setImageBitmap(bitMap1);
    globalvar = 2;
}
if(requestCode == 2)
{
    bitMap1 = (Bitmap)extras.get("data");
    imageView2.setImageBitmap(bitMap2);
    globalvar = 2;
}

これらの画像を php サーバーに送信するには、次のようにします。

protected String doInBackground(Integer... args) {
            // Building Parameters


    ByteArrayOutputStream bao1 = new ByteArrayOutputStream();
    bitMap1.compress(Bitmap.CompressFormat.JPEG, 90, bao1);
    byte [] bytearray1 = bao1.toByteArray();
    String stringba1 = Base64.encode(bytearray1);


 ByteArrayOutputStream bao2 = new ByteArrayOutputStream();
    bitMap2.compress(Bitmap.CompressFormat.JPEG, 90, bao2);
    byte [] bytearray2 = bao2.toByteArray();
    String stringba2 = Base64.encode(bytearray2);


            String parameter1 = "tenant";
                String parameter2 = "price";

            List<NameValuePair> params = new ArrayList<NameValuePair>();

                params.add(new BasicNameValuePair("person",parameter1));
                params.add(new BasicNameValuePair("price",parameter2));
                params.add(new BasicNameValuePair("image1",stringba1));
                params.add(new BasicNameValuePair("image2",stringba2));

            JSONObject json = jParser.makeHttpRequest(requiredurl, "POST", params);


            Log.d("Details", json.toString());



                int success = json.getInt("connected");

                if (success == 1) {

                    //blah blah
                      }
        }

makeHttpRequest() メソッドは次のとおりです。

public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {

        // Making HTTP request
        try {

            // check for request method
            if(method == "POST"){

                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);

                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }       

       ................
       ....................... // Here the result is extracted and made it to json object
       .............................

        // return JSON 
        return jObj;  // returning the json object to the method that calls.

    }

以下はphpコードスニペットです:

$name = $_POST[person];
$price = $_POST[price];
$binary1 = base64_decode($image2);
$binary2 = base64_decode($image2);

$file1 = tempnam($uploadPath, 'image2');
$fp1  = fopen($file1, 'wb');
fwrite($fp1, $binary1);
fclose($fp1);
.................
............................

ただし、サーバー側のフォルダーに画像を保存できません。複数の画像をアップロードする際に Base64 は好ましくない方法であると言っているいくつかのリンクを見たことがあります。誰かが私にどのように進めるか教えてもらえますか? これと他の多くのリンクを見てきましたが、その画像と一緒にいくつかのデータ(人の名前、価格など)を送信する必要があるため、要件を続行する方法がわかりません。これに関するヘルプは大歓迎です。

注:上記の一時ファイル ($file1) をサーバー フォルダーに保存する方法を誰かが教えてくれても、とても感謝しています。

4

3 に答える 3

2

複数の種類のデータを送信するにMultipartEntityは、の代わりに(質問で提供されたリンクから)使用しますURLEncodedEntity。アイデアは、さまざまなタイプ( 、、など)MultipartEntityのボディのみを含むということです。したがって、Base64で画像を送信する必要がある場合は、(を使用してリクエストのエンティティとして設定する必要があります)に関して画像を追加します。StringBodyFileBodyStringBodyMultipartEntitysetEntity

ただし、ビットマップをディスク(SDカード)に保存して、FileBody代わりに使用することを強くお勧めします。それはあなたにたくさんのメモリを節約します(Base64では一度にすべての画像をロードする必要があります)そして...ユーザーがアップロード中にアプリを閉じるとどうなりますか?ビットマップは永久に失われます。

ServicePSタスクのアップロードに使用することを忘れないでください。

于 2013-01-29T06:21:05.253 に答える
2

現在の方法論の代わりに FTP を使用することを検討しましたか? Apache の commons-net-ftp ライブラリと呼ばれる apache のライブラリがあり、この作業を簡単に行うことができます。

Apache FTP ライブラリの使用

これは私がずっと前にstackoverflowで尋ねた質問です。以前はほとんど同じコードを実装していましたが、ファイルをサーバーにアップロードするには FTP の方がはるかに簡単であることがわかりました。

@TemporaryNickName その画像とともに他のデータも送信する方法。さらに、私の画像データはURIではなくビットマップにあります。私の現在のものに従ってそれを実装する方法は?

*ビットマップを画像ファイルに変換する方法を示す多くのチュートリアルがあります (これは、ファイルを一時的に保存し、FTP が完了したらすぐに削除する方法です) さらに、デフォルトの組み込みのカメラ アプリを使用して写真を撮ると、画像が自動的に保存します。データの送信は個別に行う必要があります。この場合、$_POST を使用して PHP スクリプトを記述し、データをデータベースに保存するか XML* に書き込むよりもデータを受信します。


アップロードしたファイルを保存するには、

move_uploaded_file($src, $path);

アップロードされたファイル doc を移動する

于 2013-01-29T03:55:08.500 に答える
1

これが私のコードスニペットです。これが役立つことを願っています:

private class AsyncTask1 extends AsyncTask<Void, Void, String>{




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

        boolean response = false;

        try {

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            FileBody bin = new FileBody(new File("temp"));

            File tempImg  = new File("sdcard/signature.jpg");
            if(tempImg.exists())
            {
                checkimgfile=checkimgfile+"LPA"+tempImg;
                bin = new FileBody(tempImg, "image/jpg");
                reqEntity.addPart("txt_sign_lpa", bin);
                reqEntity.addPart("count_lpa",new StringBody("1"));
            }
            else
            {
                reqEntity.addPart("count_lpa",new StringBody("0"));
            }

                FileBody bin1 = new FileBody(new File("temp"));
                File tempImg1  = new File("sdcard/signature2.jpg");
                if(tempImg1.exists())
                {

                    checkimgfile=checkimgfile+"subject"+tempImg1;
                    bin1 = new FileBody(tempImg1, "image/jpg");
                    reqEntity.addPart("txt_sign", bin1);
                    reqEntity.addPart("count_subject",new StringBody("1"));
                }




                reqEntity.addPart("count",new StringBody("0"));


            reqEntity.addPart("name",new StringBody("Shaili"));
            reqEntity.addPart("age",new StringBody("47"));




            try
            {


            ConnectivityManager cm =
            (ConnectivityManager)getBaseContext().getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();


            if(activeNetwork!=null && activeNetwork.isAvailable() && activeNetwork.isConnected())
            {
                String xml = "";
                HttpParams httpParameters = new BasicHttpParams();  
                HttpConnectionParams.setConnectionTimeout(httpParameters, 100000);
                HttpConnectionParams.setSoTimeout(httpParameters, 100000);
                final HttpClient httpclient = new DefaultHttpClient(httpParameters);
                final HttpPost httppost = new HttpPost("https://www.xyz.com/abc.php");//url where you want to post your data.
                httppost.setParams(httpParameters);


                httppost.setEntity(reqEntity);
                httppost.addHeader("Accept", "text/html");

                httppost.addHeader("Host", "www.xyz.com");
                httppost.addHeader("User-Agent",
                        "Android ");

                HttpResponse response1 = null;
                String errMessage = "Error";
                try {

                    response1 = httpclient.execute(httppost);
                    final HttpEntity resEntity = response1.getEntity();
                    InputStream content = resEntity.getContent();
                    BufferedReader b = new BufferedReader(new InputStreamReader(
                            content));
                    xml = XmlParser.getTrimmedResponse(b);

                    if (response1 != null){
                        if(Integer.toString(response1.getStatusLine().getStatusCode()).equals("200")){
                            return "success";
                        }
                    }



                } catch (Exception e) {


                    e.printStackTrace();
                    errorstring=errorstring+e.getLocalizedMessage();
                    errMessage = "Network error";

                    return errMessage;
                }

            }
            else if(activeNetwork==null)
            {

                return "Available";
            }

            }
            catch(Exception e)
            {

            Toast.makeText(getBaseContext(), "Network Connection not available", 1).show();
            progressDialog.dismiss();

            }


        } catch (Exception e) {

            errorstring=errorstring+e.getLocalizedMessage();
            return "Network error";

        }
        return "abc";
    }       

    protected void onPostExecute(String result) {


    //do your stuff

    }
}
于 2013-01-29T10:32:05.793 に答える