无法使用 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 没有指向有效文件
我正在使用 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 没有指向有效文件