2012-10-18 50 views
0

我有一個簡單的PHP服務,我試圖從Android應用中打開,並且我想通過POST參數傳遞一個原始圖像。我有一個PHP /捲曲腳本的工作,其執行以下操作:使用AsyncHttpClient作爲POST參數的原始圖像數據

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

我想模仿的Java這事從我的Android應用程序,使用AsyncHttpClient(http://loopj.com/android-async-http /)。

聽起來很簡單,我可以用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格式打開。我已經嘗試過大小​​圖片文件。

我已經完成了研究並嘗試了很多我找到的解決方案,但似乎沒有任何工作。我確信我在這裏錯過了一些明顯的東西,但任何人都可以將我引向正確的方向嗎?

任何幫助將非常感謝!

+0

您確定從「Bitmap」到jpg的轉換工作正常嗎?我會將問題分爲兩部分1)確保轉換工作正常並且2)上傳JPG。嘗試執行轉換並將文件寫入SD卡。另外嘗試上傳一個已知的好的jpg。那麼你應該能夠找出問題所在。 –

+0

感謝您的迴應 - 是的,我確認位圖> jpg正在通過將我的字節數組寫出到文件系統上的新文件,然後確保我可以打開它(我可以)正常工作。我也直接從文件系統中提取原始文件,並從我的PHP/Curl腳本中調用服務,並且它工作正常。所以這個問題似乎是它作爲「原始數據」被附加到請求的方式。我覺得我錯過了一些明顯的東西 - 我嘗試了2種不同的方式來將字節數組作爲POST parm(請參閱原始文章,中間兩篇註釋掉的文章),但兩者都不起作用:( – svguerin3

回答

0

答案很簡單。事實證明,我確實需要對圖像進行64位編碼,因爲它在發送到服務時會發生錯誤。我這樣做,通過這個代碼:

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代碼中使用它。