2014-11-05 142 views
0

首先,感謝您閱讀我的問題。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); 

我非常感謝您的幫助。我花了幾個小時花了幾天時間尋找原因和解決方案。 非常感謝。

+0

'首先,感謝您閱讀我的question.'。你被提名爲'預先感謝獎勵';-)。 – greenapps 2014-11-05 20:43:55

回答

0

我已經解決了。 如果任何人有相同的問題:

該錯誤是發送文件的MIME類型:「圖像/ *」。出於某種原因,我的PHP代碼無法保存一些圖像。 我已將它改爲「application/octet-stream」,它的功能就像一個魅力!

這是舊代碼:

File photo = new File(selectedImagePath); 
TypedFile typedImage = new TypedFile("image/*", photo); 

這是新代碼:

File photo = new File(selectedImagePath); 
TypedFile typedImage = new TypedFile("application/octet-stream", photo); 
相關問題