You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从ConnectionRequest中获取Content-Disposition响应头信息

在Codename One中获取响应头Content-Disposition字段的方法

在Codename One里,ConnectionRequest并没有getHeaderField()方法,要获取响应头得用getResponseHeaders(),它返回一个存储所有响应头的Map<String, List<String>>。你可以按以下步骤实现需求:

具体实现步骤

  1. 通过getResponseHeaders()获取所有响应头
  2. 从响应头中找到Content-Disposition字段
  3. 解析该字段提取出文件名

代码修改部分

替换你原来注释掉的getHeaderField相关代码,添加以下逻辑到响应监听器中:

// 获取所有响应头
Map<String, List<String>> headers = request.getResponseHeaders();
String disposition = null;
if (headers != null) {
    // 遍历头信息,不区分大小写匹配Content-Disposition
    for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
        if (entry.getKey().toLowerCase().equals("content-disposition")) {
            // 取第一个值即可,该头通常只有一个值
            disposition = entry.getValue().get(0);
            break;
        }
    }
}

// 先设置默认文件名,防止服务器未返回该头时出错
String fileName = "CSVModule"+ postUrl.substring(postUrl.lastIndexOf('/') + 1) + ".xlsx";
if (disposition != null && !disposition.isEmpty()) {
    // 解析filename部分,兼容带引号和不带引号的格式
    String[] parts = disposition.split(";");
    for (String part : parts) {
        part = part.trim();
        if (part.startsWith("filename=")) {
            fileName = part.substring(9);
            // 去掉文件名两端可能存在的引号
            if (fileName.startsWith("\"") && fileName.endsWith("\"")) {
                fileName = fileName.substring(1, fileName.length() - 1);
            }
            break;
        }
    }
}
// 拼接最终保存路径
String saveDirectory = FileSystemStorage.getInstance().getAppHomePath() + fileName;

修改后的完整响应监听器代码

request.addResponseListener(evt -> {
    if (request.getResponseCode() == 200) {
        // 获取响应头并解析Content-Disposition
        Map<String, List<String>> headers = request.getResponseHeaders();
        String disposition = null;
        if (headers != null) {
            for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
                if (entry.getKey().toLowerCase().equals("content-disposition")) {
                    disposition = entry.getValue().get(0);
                    break;
                }
            }
        }

        // 设置默认文件名
        String fileName = "CSVModule"+ postUrl.substring(postUrl.lastIndexOf('/') + 1) + ".xlsx";
        if (disposition != null && !disposition.isEmpty()) {
            String[] parts = disposition.split(";");
            for (String part : parts) {
                part = part.trim();
                if (part.startsWith("filename=")) {
                    fileName = part.substring(9);
                    if (fileName.startsWith("\"") && fileName.endsWith("\"")) {
                        fileName = fileName.substring(1, fileName.length() - 1);
                    }
                    break;
                }
            }
        }
        String saveDirectory = FileSystemStorage.getInstance().getAppHomePath() + fileName;

        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);
                }
                ToastBar.Status status = ToastBar.getInstance().createStatus();
                status.setMessage("File downloaded");
                status.setExpires(3000);
                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());
    }
});

注意事项

  • 响应头名称不区分大小写,所以用toLowerCase()匹配更稳妥
  • 保留默认文件名逻辑,确保服务器未返回Content-Disposition时程序仍能正常运行
  • 兼容了filename="xxx.xlsx"和filename=xxx.xlsx两种常见格式

内容的提问来源于stack exchange,提问作者James N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:04:53