0

Androidアプリからヒットしようとしている単純なPHPサービスがあり、POSTパラメーターを介して生の画像を渡したいと思います。次のことを行うPHP/curlスクリプトが機能しています。

$url = "http://myphp.php"
$imagefilepath = 'path_to_png_file.png';
$imagedata = file_get_contents($imagefilepath);
$data = array('imagedata' => $imagedata);
// a few other fields are set into $data, but not important

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5');
curl_exec($ch);

AsyncHttpClient(http://loopj.com/android-async-http/)を使用して、AndroidアプリからJavaでこれを模倣したいと思います。

簡単そうに聞こえますが、Javaで呼び出しを機能させることができますが、問題は、送信するデータが相手側で画像として認識されないことです。ただし、上記のPHP / Curlスクリプトを使用すると、すべての面で正常に機能します。

これが私のJavaコードで、私が試したいくつかのコメントアウトされたものがあります。

String photoFilePath = "path_to_my_photo_on_disk.jpg";

Bitmap bm = BitmapFactory.decodeFile(photoFilePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 50, baos);
byte[] byteArrayPhoto = baos.toByteArray();

AsyncHttpClient client = new AsyncHttpClient(context);
RequestParams params = new RequestParams();
try {
      // THINGS I HAVE TRIED (AND FAILED):
      //params.put("imagedata", new File(photoFilePath));
      //params.put("imagedata", new ByteArrayInputStream(byteArrayPhoto), "photo.jpg");                        
      //params.put("imagedata", new String(byteArrayPhoto));
      //params.put("imagedata", new String(byteArrayPhoto, "UTF-8"));
      //params.put("imagedata", fileToString(photoFilePath));
      //params.put("imagedata", new FileInputStream(new File(photoFilePath)), "photo.jpg", "image/jpeg");
} catch (Exception e) {
      e.printStackTrace();
}

client.post(context, myURL, params, new AsyncHttpResponseHandler() {
...override methods, onSuccess() is called...
}

// for reference, for the above-called method:
private String fileToString(String filename) throws IOException
    {
        BufferedReader reader = new BufferedReader(new FileReader(filename));
        StringBuilder builder = new StringBuilder();
        String line;

        // For every line in the file, append it to the string builder
        while((line = reader.readLine()) != null)
        {
            builder.append(line);
        }

        return builder.toString();
    }
  • 上記のコメントアウトされた行/試行のいくつかでは、POSTパラメーターが反対側に到達することさえないことに注意してください。

また、ファイルをバイト配列に入れる方法や、ファイル(base64)をエンコードする方法をいくつか試しましたが、運が悪かったです。何らかの理由で呼び出しは成功し、データは転送されますが、サーバー側で画像を開こうとすると、画像が破損したり、JPGとして開かなかったりします。小さい画像ファイルと大きい画像ファイルを試しました。

私は間違いなく調査を行い、見つけた多くの解決策を試しましたが、何も機能していないようです。私はここで明らかな何かを見逃していると確信していますが、誰かがこれについて正しい方向に私を導くことができますか?

どんな助けでも大歓迎です!!

4

1 に答える 1

0

これに対する答えはかなり単純でした。結局のところ、サービスに送信するときに何らかの理由で画像が破損していたため、画像をbase64でエンコードする必要がありました。私はこのコードを介してこれを行いました:

String encodedPhotoStr = Base64.encodeToString(byteArrayPhoto, Base64.DEFAULT);
params.put("imagedata", encodedPhotoStr);

ただし、PHP側では、このデータを次のようにデコードするために行を追加することが不可欠でした。

$raw_data_str = base64_decode($data_str_from_java)

これにより問題が修正され、送信後に画像が表示されるようになりました。したがって、何らかの理由で、JavaからPHPに生のバイナリ/イメージデータを送信することは(curlスクリプトが正常に機能しているにもかかわらず)機能せず、Javaコードから機能させるには、この方法でエンコードおよびデコードする必要がありました。

于 2012-10-18T19:03:32.847 に答える