当前位置: 首页 > 面试题库 >

配置Spring MVC控制器将文件发送到客户端

连坚白
2023-03-14
问题内容

我认为我的情况很普遍。我有一个数据库,我希望我的Spring MVC应用程序在控制器中接受请求,调用DB服务以获取数据并将该数据作为CSV文件发送到客户端。我正在使用JavaCSV此处找到的库来协助完成此过程:http
:
//sourceforge.net/projects/javacsv/

我发现了一些人在做类似事情并将一些看起来正确的东西拼凑在一起的例子。但是,当我使用该方法时,实际上没有任何反应。

我以为将数据写入HttpServletResponse的outputStream就足够了,但是显然我缺少了一些东西。

这是我的控制器代码:

@RequestMapping(value="/getFullData.html", method = RequestMethod.GET)
public void getFullData(HttpSession session, HttpServletRequest request, HttpServletResponse response) throws IOException{
    List<CompositeRequirement> allRecords = compReqServ.getFullDataSet((String)session.getAttribute("currentProject"));

    response.setContentType("data:text/csv;charset=utf-8"); 
    response.setHeader("Content-Disposition","attachment; filename=\yourData.csv\"");
    OutputStream resOs= response.getOutputStream();  
    OutputStream buffOs= new BufferedOutputStream(resOs);   
    OutputStreamWriter outputwriter = new OutputStreamWriter(buffOs);

    CsvWriter writer = new CsvWriter(outputwriter, '\u0009');  
    for(int i=1;i <allRecords.size();i++){              
        CompositeRequirement aReq=allRecords.get(i);  
        writer.write(aReq.toString());  
    }     
    outputwriter.flush();   
    outputwriter.close();

};

我在这里错过了哪一步?基本上,最终结果是……什么都没有。我本来以为设置标题和内容类型会导致我的浏览器选择响应并触发文件下载操作。


问题答案:

似乎是因为您的Content-
type设置不正确,因此应response.setContentType("text/csv;charset=utf-8")改为response.setContentType("data:text/csv;charset=utf-8")

另外,如果您使用的是Spring 3,则可能应该使用@ResponseBody

HttpMessageConverter进行代码重用。例如:

  • 在控制器中:
        @RequestMapping(value = "/getFullData2.html", method = RequestMethod.GET, consumes = "text/csv")
    @ResponseBody // indicate to use a compatible HttpMessageConverter
    public CsvResponse getFullData(HttpSession session) throws IOException {
          List<CompositeRequirement> allRecords = compReqServ.getFullDataSet((String) session.getAttribute("currentProject"));
          return new CsvResponse(allRecords, "yourData.csv");
    }
  • 加上一个简单的HttpMessageConverter:
        public class CsvMessageConverter extends AbstractHttpMessageConverter<CsvResponse> {
       public static final MediaType MEDIA_TYPE = new MediaType("text", "csv", Charset.forName("utf-8"));
       public CsvMessageConverter() {
           super(MEDIA_TYPE);
       }

       protected boolean supports(Class<?> clazz) {
           return CsvResponse.class.equals(clazz);
       }

       protected void writeInternal(CsvResponse response, HttpOutputMessage output) throws IOException, HttpMessageNotWritableException {
           output.getHeaders().setContentType(MEDIA_TYPE);
           output.getHeaders().set("Content-Disposition", "attachment; filename=\"" + response.getFilename() + "\"");
           OutputStream out = output.getBody();
           CsvWriter writer = new CsvWriter(new OutputStreamWriter(out), '\u0009');
           List<CompositeRequirement> allRecords = response.getRecords();
           for (int i = 1; i < allRecords.size(); i++) {
                CompositeRequirement aReq = allRecords.get(i);
                writer.write(aReq.toString());
           }
           writer.close();
       }
    }
  • 和一个简单的对象将所有内容绑定在一起:
        public class CsvResponse {    
       private final String filename;
       private final List<CompositeRequirement> records;

       public CsvResponse(List<CompositeRequirement> records, String filename) {
           this.records = records;
           this.filename = filename;
       }
       public String getFilename() {
           return filename;
       }
       public List<CompositeRequirement> getRecords() {
           return records;
       }
    }


 类似资料:
  • 问题内容: 您好,我一直在尝试将文件从node.js发送到客户端。 我的代码有效,但是当客户端转到指定的url()时,它将流式传输文件。 从Google Chrome浏览器访问该文件可使文件(.mp3)在播放器中播放。 我的目标是让客户的浏览器下载文件,然后问客户他想在哪里存储文件,而不是在网站上流式传输。 问题答案: 您需要设置一些标题标志。 用下载代替流媒体;

  • 问题内容: 我使用此功能将html文件发送到客户端,但是在客户端中我什么也没有得到(空白页),没有错误。我有什么问题吗?,请帮忙? 我的test.html文件 问题答案: 尝试这样的代码: 使用res.sendFile而不是手动读取文件,以便express可以为您正确设置内容类型。 您不需要这行,因为这是由express内部处理的。

  • 问题内容: 我正在尝试从服务器向客户端发送文件,即服务器请求的客户端。客户端指定中的文件,然后将其发送到服务器,服务器将文件大小添加到文件中,然后将其返回给客户端。 客户端向其管道添加具有正确文件大小的新文件。 服务器使用上下文和所需文件创建一个新文件,并尝试发送该文件,但是从不读取该字节。 我在这里做错了什么? 记录 客户 FileRequestHandler.java FileChunkReq

  • 问题内容: 我正在尝试找到一种方法,将不同文件类型的文件从服务器发送到客户端。 我在服务器上有以下代码将文件放入字节数组: 然后,我将fileData作为字符串发送给客户端。这对于txt文件效果很好,但是当涉及到图像时,我发现尽管它可以很好地创建包含数据的文件,但图像无法打开。 我不确定我是否正在按照正确的方式进行操作。谢谢您的帮助。 问题答案: 如果要读取/写入二进制数据,则应使用字节流(Inp

  • 我试图从客户端复制文件到服务器,在Java,像这样: 客户: 服务器: 当我跑步时,我得到: 但什么都没发生。这是我第一次使用客户机服务器,我不确定自己出了什么问题。 请帮帮忙。谢谢你。

  • 我在服务器中部署了基于soap的cxf服务服务器,在不同的服务器中部署了基于soap的cxf服务客户端。这两个服务器都具有有效的SSL证书。在不同的场景中,两者都充当客户机和服务器。现在我通过服务器调用客户端服务,tomcat并没有向客户端发送服务器证书。那么tomcat是否有任何配置或jvm来向客户端发送ssl证书呢。请帮帮我。 我添加了JAVA_选项的更多细节 -贾瓦克斯。网调试=ssl -贾