关于文件下载

关于文件下载_第1张图片

引言

由于项目需要,需要实现对特定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实体对象即可

你可能感兴趣的:(关于文件下载)