从ConnectionRequest(Content-Disposition)获取Header信息

问题描述 投票:0回答:1

使用下面的代码,我可以根据某些过滤器从远程服务器下载并保存文件。我使用 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");

但这不受支持。我怎样才能实现这个目标?

codenameone
1个回答
0
投票

您可以通过覆盖

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,它可以实现更流畅的标头访问。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.