首先,感謝您閱讀我的問題。PHP服務器:保存(上傳)從Android的圖像與改造
我有一個PHP服務器,我想從Android設備上傳圖片。 當我在手機中選擇一個圖像時,它將作爲TypedFile(retrofit.mime.TypedFile)上傳到PHP腳本。 當我想使用Web瀏覽器查看圖像或使用FTP客戶端下載圖像時,圖像已損壞。 Log顯示圖像字節,下載的文件包含這些字節。 圖像的第一行的字節是:
RIFF WEBPVP8 „ ¥ *,>Ñ`©P(%$##‘Œ9 i;\·û~œdàþ ÚKfëp‡ö~
(WebP的MIME類型?)
我的PHP腳本是這樣的:
[...]
$pic = 'uploaded_images/' . $imagename . '.jpg';
if (!move_uploaded_file($_FILES['image']['tmp_name'], $pic)) {
echo "ko";die;
}
[...]
我也曾嘗試的fread,fwrite的,. ..和這個:
$file = file_get_contents($_FILES['image']['tmp_name']);
if (!$file) {echo 'file ko';die;}
//$file = unpack('h',$file);
if (!file_put_contents($pic, $file)) {echo 'ko';die;}
和其他一些組合。
我的Android請求是(從Intent.ACTION_PICK或Intent.ACTION_IMAGE_CAPTURE):
@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch (requestCode) {
case SELECT_PHOTO:
if (resultCode == Activity.RESULT_OK) {
final boolean isCamera;
if (imageReturnedIntent == null) {
isCamera = true;
} else {
final String action = imageReturnedIntent.getAction();
if (action == null) {
isCamera = false;
} else {
isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
}
}
Uri selectedImageUri;
if (isCamera) {
selectedImageUri = outputFileUri;
} else {
selectedImageUri = imageReturnedIntent == null ? null : imageReturnedIntent.getData();
}
if (selectedImageUri != null) {
String selectedImagePath = null;
Cursor cursor = getActivity().getContentResolver().query(selectedImageUri, null, null, null, null);
if (cursor == null) {
selectedImagePath = selectedImageUri.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
selectedImagePath = cursor.getString(idx);
}
File photo = new File(selectedImagePath);
TypedFile typedImage = new TypedFile("image/*", photo);
// ProgressDialog lazy initialization
if (progress == null) {
progress = new ProgressDialog(getActivity());
progress.setTitle(getString(R.string.updating_data));
progress.setMessage(getString(R.string.please_wait));
progress.setCancelable(false);
progress.setIndeterminate(true);
}
progress.show();
Server.postUserImage(typedImage, imageCallback);
}
}
}
}
Server.postUserImage是我配置請求的方法。 改造請求界面是:
@Multipart
@POST("/user/image")
void postUserImage(@Part("image") TypedFile image, Callback<User> callback);
我非常感謝您的幫助。我花了幾個小時花了幾天時間尋找原因和解決方案。 非常感謝。
'首先,感謝您閱讀我的question.'。你被提名爲'預先感謝獎勵';-)。 – greenapps 2014-11-05 20:43:55