我有一個簡單的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格式打開。我已經嘗試過大小圖片文件。
我已經完成了研究並嘗試了很多我找到的解決方案,但似乎沒有任何工作。我確信我在這裏錯過了一些明顯的東西,但任何人都可以將我引向正確的方向嗎?
任何幫助將非常感謝!
您確定從「Bitmap」到jpg的轉換工作正常嗎?我會將問題分爲兩部分1)確保轉換工作正常並且2)上傳JPG。嘗試執行轉換並將文件寫入SD卡。另外嘗試上傳一個已知的好的jpg。那麼你應該能夠找出問題所在。 –
感謝您的迴應 - 是的,我確認位圖> jpg正在通過將我的字節數組寫出到文件系統上的新文件,然後確保我可以打開它(我可以)正常工作。我也直接從文件系統中提取原始文件,並從我的PHP/Curl腳本中調用服務,並且它工作正常。所以這個問題似乎是它作爲「原始數據」被附加到請求的方式。我覺得我錯過了一些明顯的東西 - 我嘗試了2種不同的方式來將字節數組作爲POST parm(請參閱原始文章,中間兩篇註釋掉的文章),但兩者都不起作用:( – svguerin3