【已解决】 okhttp上传文件到php服务器失败,用html上传到php接口没问题,哪里有问题?
# okhttp上传文件到php服务器失败,用html上传到php接口没问题,哪里有问题?
# xml代码
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="uploadFile"
android:text="UploadFile"
android:textAllCaps="false" />
# 对应onclick方法
public void uploadFile(View view){
//创建客户端,类似浏览器
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.build();
//创建传递内容
File file = new File("/sdcard/1111.png");
MediaType fileType = MediaType.parse("image/png");
RequestBody fileBody = RequestBody.create(file, fileType);
RequestBody requestBody = new MultipartBody.Builder()
.addFormDataPart("file",file.getName(), fileBody)
.build();
//创建连接地址,也就是接口地址
Request request = new Request.Builder()
.url("http://39.98.139.47/uploadfile.php")
.post(requestBody)
.build();
//创建连接任务,获得返回结果
Call task = okHttpClient.newCall(request);
task.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.d(TAG," fail --> " + e.toString());
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
int code = response.code();
Log.d(TAG, " CODE ---> " + code);
if (code == HttpURLConnection.HTTP_OK) {
String result = response.body().string();
if (result != null) {
Log.d(TAG, " result --> " + result);
}
}
}
});
}
# 服务器上php接口文件代码
<?php
$base_path = "./upload/"; //接收文件目录
$target_path = $base_path . basename ( $_FILES ['file'] ['name'] );
if (move_uploaded_file ( $_FILES ['file'] ['tmp_name'], $target_path )) {
$array = array ("code" => "1", "message" => $_FILES ['file'] ['name'] );
echo json_encode ( $array );
return json_encode ( $array );
} else {
$array = array ("code" => "0", "message" => "There was an error uploading the file, please try again!" . $_FILES ['uploadfile'] ['error'] );
echo json_encode ( $array );
return json_encode ( $array );
}
app请求uploadfile.php接口结果,提示错误,服务器upload文件夹中也没有上传的图片文件。(问题所在)
D/OkhttpActivity: CODE ---> 200
D/OkhttpActivity: result --> {"code":"0","message":"There was an error uploading the file, please try again!"}
但是,我用html来请求uploadfile.php接口,结果正常,服务器upload文件夹中有上传的新文件。

弄不明白是什么原因,有没有大神帮忙看看是哪里有错误。谢谢了。
你也没说报啥错呀?
先定位问题,是你服务器的问题呢,还是你android代码的问题对吧。
你的浏览器可以上传,那么很大程序是你android程序 的问题。
如果是你android程序 的问题,那你看看log,或者提供一下log咯。
File file = new File("/sdcard/1111.png");
问题应该在这里,不能这样直接访问文件
第一,你必须有权限读取内部存储;
第二,你访问这个文件,可以用api访问,不要写sdcard、xxxx什么的;
第三,你获得这个file对象之后,要判断下,file是否存在file.exists(),判断是否正常访问到了。这样对排查,有一个节点
第四,是否正确使用okhttp 的api;
这样一步一步排查
后来排查,发现php接口根本没有读到客户端传递的file信息,
echo $_FILES 返回结果是null。确定是android代码的问题。
增加了这一行
现在ok了