美文网首页
关于文件下载

关于文件下载

作者: 殇别云之 | 来源:发表于2016-01-05 14:30 被阅读0次

    引言

    由于项目需要,需要实现对特定Excel模板数据的导入操作,而模板需要由开发人员设计,而模板需要对各种数据做校验,取特定值等限制,所以下载模板的方式就使用了文件下载的方式来实现。

    实现

    项目使用 JFinal搭建,在JSP客户端使用 js直接跳转的方式请求服务链接

    window.location.href=$("#basePath").val() + "/mission/template/download/" + $("#templateType").val();
    

    而在后台,我们将制作好的模板放置到 src/main/resources目录下


    Paste_Image.png

    接下来只需要将文件转换为workbook。

    String completeFilePath = MissionController.class.getClassLoader().getResource("/").getPath() + Constants.DEFAULT_TEMPLATE_FOLDER + fileName;
    Workbook workbook = WorkbookFactory.create(new File(completeFilePath));
    

    JFinal支持可按照自己的render方式来渲染请求结果,针对excel文件下载,我们继承了Render类,并重写 render方法

    @Override
        public void render() {
            OutputStream os = null;
            try {
                response.reset();
                final String userAgent = request.getHeader("USER-AGENT");
                if(StringUtils.contains(userAgent, "MSIE")||StringUtils.contains(userAgent, "Trident")){//IE浏览器
                    fileName = URLEncoder.encode(fileName,"UTF8");
                }else if(StringUtils.contains(userAgent, "Mozilla")){//google,火狐浏览器
                    fileName = new String(fileName.getBytes("utf-8"), "ISO8859-1");
                }else{
                    fileName = URLEncoder.encode(fileName,"UTF8");//其他浏览器
                }
                response.setHeader("Content-disposition", "attachment; filename=" + fileName);
                response.setContentType("application/vnd.ms-excel;charset=utf-8;");
                os = response.getOutputStream();
                workbook.write(os);
            } catch (UnsupportedEncodingException e1) {
                e1.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {
                    if(os != null){
                        os.flush();
                        os.close();                     
                    }
                } catch (IOException e) {
                    throw new RenderException(e);
                }
            }
        }
    

    这个方法主要说明一点:这里为兼容各种浏览器的下载(若未对fileName做处理,IE下会出现中文名称乱码问题),对各种浏览器下我们对fileName进行编码处理。而下载方式主要取得response的输出流,并将workbook写入到输出流即可。
    最后,在Controller层的最后,渲染render实体对象即可

    相关文章

      网友评论

          本文标题:关于文件下载

          本文链接:https://www.haomeiwen.com/subject/gelzhttx.html