使用Retrofit

时间:2015-05-15 08:20:37

标签: php android 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);
}

在图片上传时,服务器返回:“unknown errror”。

1 个答案:

答案 0 :(得分:1)

这是因为您的开关默认为未知错误,而UPLOAD_ERR_OK的值为零

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

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

但是你应该检查$ destination是否是要写入的有效文件,并且进程有权写入

同样作为一种良好的编码习惯,你不应该使用诸如1,2,3之类的魔法值。而是使用常量! UPLOAD_ERR_OKUPLOAD_ERR_NO_FILE ..

...

看起来你也尝试过使用表单并且可以正常使用

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

我正在以完全相同的方式使用改造,并且其工作完美

如果全部失败,我会尝试使用HTTP流量监控代理监控流量,例如 Charles

并查看文件是否实际发送

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