如何从ConnectionRequest中获取Content-Disposition响应头信息
在Codename One中获取响应头Content-Disposition字段的方法
在Codename One里,ConnectionRequest并没有getHeaderField()方法,要获取响应头得用getResponseHeaders(),它返回一个存储所有响应头的Map<String, List<String>>。你可以按以下步骤实现需求:
具体实现步骤
- 通过
getResponseHeaders()获取所有响应头 - 从响应头中找到
Content-Disposition字段 - 解析该字段提取出文件名
代码修改部分
替换你原来注释掉的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
相关产品推荐
相关产品推荐

