okhttp3 Null Respone 上传文件
okhttp3 Null Respone uploading file
您好,我正在尝试使用 okhttp3 的多部分请求将 jpg 文件上传到 php 服务器。该脚本检查 $_FILES["image1"] 并从 html 表单正常工作。使用以下代码时,我从服务器收到空响应。
如果我删除最后一个包含文件上传部分的 addFormDataPart,我会从服务器收到未设置 image1 的响应。
编辑* 我发现 boolean b = files.get(0).isFile(); return对于存储在我的移动设备上的文件为 false,对于 dropbox 中的文件为 true。 Dropbox 文件 return phone 上的正确响应文件仍然 return 空 http 响应。有什么建议吗?
public AsyncHttpPost(String id, String password, List<File> files, OnTaskComplete listener ) {
MediaType MEDIA_TYPE_JPG = MediaType.parse("image/jpg");
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(ResponseDTO.TAG_ID, String.valueOf(id))
.addFormDataPart(ResponseDTO.TAG_PASSWORD, password)
.addFormDataPart("image1", "Test.jpg", RequestBody.create(MEDIA_TYPE_JPG, files.get(0)));
mRequestBody = builder.build();
mListener = listener;
}
public AsyncHttpPost() {
}
public void setListener(OnTaskComplete listener){
mListener = listener;
}
@Override
protected String doInBackground(String... params) {
String result = "";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(params[0])
.post(mRequestBody)
.build();
Response response = null;
try {
response = client.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(response != null) {
result = response.body().string();
}else{
result = "null";
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
当使用 URI 路径时,isFile() 返回 false。所以我必须使用如下路径创建文件。这会在几秒钟后导致空响应,因此我还更新了我的 http 客户端的超时值
File f = new File(uri.getPath()); //didnt work
File f = new File("/storage/emulated/0/DCIM/Camera/Test.jpg");
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(300, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
您好,我正在尝试使用 okhttp3 的多部分请求将 jpg 文件上传到 php 服务器。该脚本检查 $_FILES["image1"] 并从 html 表单正常工作。使用以下代码时,我从服务器收到空响应。
如果我删除最后一个包含文件上传部分的 addFormDataPart,我会从服务器收到未设置 image1 的响应。
编辑* 我发现 boolean b = files.get(0).isFile(); return对于存储在我的移动设备上的文件为 false,对于 dropbox 中的文件为 true。 Dropbox 文件 return phone 上的正确响应文件仍然 return 空 http 响应。有什么建议吗?
public AsyncHttpPost(String id, String password, List<File> files, OnTaskComplete listener ) {
MediaType MEDIA_TYPE_JPG = MediaType.parse("image/jpg");
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(ResponseDTO.TAG_ID, String.valueOf(id))
.addFormDataPart(ResponseDTO.TAG_PASSWORD, password)
.addFormDataPart("image1", "Test.jpg", RequestBody.create(MEDIA_TYPE_JPG, files.get(0)));
mRequestBody = builder.build();
mListener = listener;
}
public AsyncHttpPost() {
}
public void setListener(OnTaskComplete listener){
mListener = listener;
}
@Override
protected String doInBackground(String... params) {
String result = "";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(params[0])
.post(mRequestBody)
.build();
Response response = null;
try {
response = client.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(response != null) {
result = response.body().string();
}else{
result = "null";
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
当使用 URI 路径时,isFile() 返回 false。所以我必须使用如下路径创建文件。这会在几秒钟后导致空响应,因此我还更新了我的 http 客户端的超时值
File f = new File(uri.getPath()); //didnt work
File f = new File("/storage/emulated/0/DCIM/Camera/Test.jpg");
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(300, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();