2014-11-05 103 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); 
相关问题