无法使用 Retrofit 将图像发送到服务器

Can't send image to server with Retrofit

我正在使用 Retrofit 库将文件上传到 php 服务器,但出现 Unknow error

这是我的 Android 代码:

改造服务:

@Multipart
@POST("/upload_image.php")
public void uploadImage(@Part("file") TypedFile file, @Query("id_client") long id_client, @Query("id_obj") long id_obj, Callback<Boolean> callback);

上传代码:

public void uploadImage(String imagePath, long, clientId, Obj obj, Callback<Boolean> callback) {
    TypedFile typedFile = new TypedFile("application/octet-stream", new File(imagePath));
    mService.uploadImage(typedFile, clientId, obj.getId(), callback);
}

Php代码:

if(move_uploaded_file($_FILES["file"]["tmp_name"],  $destination)){
   echo ("Stored     in".$_SERVER[DOCUMENT_ROOT]."/Uploader/UploadedFiles/".$_FILES["file"]["name"]);
} else {
$html_body = '<h1>File upload error!</h1>';
switch ($_FILES[0]['error']) {
case 1:
   $html_body .= 'The file is bigger than this PHP installation allows';
   break;
case 2:
   $html_body .= 'The file is bigger than this form allows';
   break;
case 3:
  $html_body .= 'Only part of the file was uploaded';
  break;
case 4:
   $html_body .= 'No file was uploaded';
   break;
default:
   $html_body .= 'unknown errror';
} 
echo ($html_body);
}

上传图片时,服务器 returns : "unknown errror".

那是因为你的开关默认为未知错误,UPLOAD_ERR_OK 的值为零

因此您应该检查 $_FILES['image']['error'] 的值是否为 0,如果是,请跳过此错误处理

实际上看起来 move_uploaded_file 失败了,但是很难说不知道 $destination 变量指向什么

但是您应该检查 $destination 是否是一个有效的写入文件以及进程是否有写入权限

此外,作为一种良好的编码习惯,您不应使用 1、2、3 等神奇值。而应使用常量! UPLOAD_ERR_OK, UPLOAD_ERR_NO_FILE..

..

看起来你也用 form 试过它并且有效

您应该检查设备中的 TypedFile 是否指向 现有文件

我正在以完全相同的方式使用改装并且它的工作完美

如果所有这些都失败了,我会尝试使用 HTTP 流量监控代理来监控流量,例如 Charles

看看文件是否真的被发送了

但我会说 typedfile 没有指向有效文件