【发布时间】:2020-10-27 00:56:26
【问题描述】:
我正在尝试使用以下方法通过 Web API 发送 PDF 文件:
public static <function> JSONObject uploadFile(String url, Context context, JSONObject jsondata, String imagepath) {
sJsonObj = null;
sb = null;
try {
sUrl = new URL(url);
sHttpUrlConnection = (HttpURLConnection) sUrl.openConnection();
sHttpUrlConnection.setDoInput(true);
sHttpUrlConnection.setDoOutput(true);
sHttpUrlConnection.setUseCaches(false);
sHttpUrlConnection.setReadTimeout(sTimeout);
sHttpUrlConnection.setConnectTimeout(sTimeout);
sHttpUrlConnection.setRequestMethod(HttpPost.METHOD_NAME);
sHttpUrlConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + BOUNDARY);
sHttpUrlConnection.setRequestProperty("fileName", imagepath);
sHttpUrlConnection.setRequestProperty("Connection", "Keep-Alive");
sPrintWriter = new PrintWriter(sHttpUrlConnection.getOutputStream());
sPrintWriter.append(TWO_HYPHENS + BOUNDARY)
.append(LINE_END)
.append("Content-Disposition: form-data;name=\"body\"")
.append(LINE_END)
.append(LINE_END)
.append(jsondata.toString())
.append(LINE_END)
.append(TWO_HYPHENS + BOUNDARY)
.append(LINE_END)
.append("Content-Disposition: form-data; name=\"fileName\"; filename=\"" + new File(imagepath).getAbsoluteFile() + "\"")
.append(LINE_END)
.append("Content-Type: "
+ URLConnection.guessContentTypeFromName(imagepath))
.append(LINE_END)
.append("Content-Transfer-Encoding: binary")
.append(LINE_END)
.append(LINE_END);
sPrintWriter.flush();
FileInputStream fileStream = new FileInputStream(imagepath);
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = fileStream.read(buffer)) != -1) {
sHttpUrlConnection.getOutputStream().write(buffer, 0, bytesRead);
}
fileStream.close();
sPrintWriter.append(LINE_END);
sPrintWriter.append(TWO_HYPHENS);
sPrintWriter.append(BOUNDARY);
sPrintWriter.append(TWO_HYPHENS);
sPrintWriter.flush();
sHttpUrlConnection.getOutputStream().close();
if (true) {
BufferedReader reader = null;
reader = new BufferedReader(new InputStreamReader(sHttpUrlConnection.getInputStream()));
sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
reader.close();
sJsonObj = new JSONObject(sb.toString());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
sHttpUrlConnection.disconnect();
}
return sJsonObj;
}
如果你仔细看uploadFile方法的参数,你会发现最后一个参数是filePath,
在Stack Overflow上连续2天搜索后,我发现在某些较新的Android版本中我无法获取filePath。
而且我的应用支持Api level 21到30,所以大家都建议只通过传递URI试试。
现在,在这个 uploadFile 方法中,如果我尝试将最后一个参数从 String 更改为 Uri,那么很多地方都会出现编译器错误。现在我不明白我应该在这个方法中改变什么?
任何人都可以用相同的方法发布一些修改的答案,这将非常感激。
FileNotFound 异常即将到来,如果我将通过 uri.getPath
【问题讨论】:
标签: java android android-asynctask