使用下面的代码,我可以根据某些过滤器从远程服务器下载并保存文件。我使用 ConnectionRequest 向服务器发出发布请求。这效果很好。但是我需要获取请求的一些标头信息并且很挣扎。
private void handleDownload(String module, String filtersJson) {
Log.p("Handling download for URL: " + "https://website/api/csv/"+module);
String postUrl = "https://website/api/csv/"+module;
try {
JSONParser parser = new JSONParser();
Map<String, Object> parsedResult = parser.parseJSON(new StringReader(filtersJson));
ConnectionRequest request = new ConnectionRequest(postUrl, true);
request.addArgument("Filters[FilterAll]", (String) parsedResult.get("FilterAll"));
for (int i = 0; i <= 31; i++) {
String key = "Filter" + i;
request.addArgument("Filters[" + key + "]", (String) parsedResult.get(key));
}
request.addArgument("Filters[To]", (String) parsedResult.get("To"));
request.addArgument("Filters[From]", (String) parsedResult.get("From"));
request.addArgument("Filters[UseDat]", (String) parsedResult.get("UseDat"));
request.addArgument("order[0][column]", "0");
request.addArgument("order[0][dir]", "desc");
request.addArgument("search[value]", "");
request.setFailSilently(true);
request.setReadResponseForErrors(true);
request.addRequestHeader("Authorization", "Bearer " + eventsToken);
request.setTimeout(10000);
request.addResponseListener(evt -> {
if (request.getResponseCode() == 200) {
String fileName = "CSVModule"+ postUrl.substring(postUrl.lastIndexOf('/') + 1);
String saveDirectory = FileSystemStorage.getInstance().getAppHomePath() + fileName + ".xlsx";
// =NOT SUPPORTED=
// String disposition = request.getHeaderField("Content-Disposition");
Display.getInstance().callSerially(() -> {
try (OutputStream outputStream = FileSystemStorage.getInstance().openOutputStream(saveDirectory)) {
int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
int bytesRead;
InputStream inputStream = new ByteArrayInputStream(request.getResponseData());
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
//TODO add progress bar instead of below Toastbar
ToastBar.Status status = ToastBar.getInstance().createStatus();
status.setMessage("File downloaded");
status.setExpires(3000); // only show the status for 3 seconds, then have it automatically clear
status.show();
Log.p("File successfully downloaded to: " + saveDirectory);
} catch (Exception e) {
Log.e(e);
}
System.out.println("File downloaded and saved as: " + saveDirectory);
});
} else {
Log.p("Failed to download file: " + request.getResponseErrorMessage());
}
});
NetworkManager.getInstance().addToQueueAndWait(request);
}
catch (Exception e) {
e.printStackTrace();
}
}
我想检索 Content-Disposition 标头,以便我可以添加正确的文件名进行保存。像这样的行:-
String disposition = request.getHeaderField("Content-Disposition");
但这不受支持。我怎样才能实现这个目标?
您可以通过覆盖
readHeaders
来做到这一点,例如:
class MyConnectionRequest extends ConnectionRequest {
public String contentDisposition;
public MyConnectionRequest(String postUrl) {
super(postUrl, true);
}
protected void readHeaders(Object connection) throws IOException {
contentDisposition = request.getHeader(connection, "Content-Disposition");
}
}
然后您可以像之前一样使用此连接请求,并且该字段应该正确初始化。
仅供参考,对于这些请求有一个更简单的 API,称为
Rest
API,它可以实现更流畅的标头访问。