zoukankan      html  css  js  c++  java
  • springmvc文件下载之文件名下划线问题终极解决方案

    直接上代码:Action中代码片段。

    @RequestMapping("download")
    public String download(ModelMap model, @ModelAttribute("e") Template t, HttpServletResponse response, HttpServletRequest request) throws Exception {
    Account acc = getLoginAccount();   
    if(acc==null || StringUtils.isBlank(acc.getAccount())){
    return ("/account/login");
    }
    String fileUrl = template.getFileUrl();   //url 路径, 如 http://×××××/×××/××××/image/20170525/中文.jpg
    String filename = fileUrl.substring(fileUrl.lastIndexOf("/")+1);  //截取最后的文件名  -> 中文.jpg
    filename = processFileName( request, filename);
    BufferedOutputStream bf = null;
    try {
    response.setHeader("Content-disposition", "attachment; filename = " + filename);
    bf = new BufferedOutputStream(response.getOutputStream());
    bf.write(this.httpConverBytes(fileUrl,request));
    }....


    重要的 processFileName方法。
    public static String processFileName(HttpServletRequest request, String fileNames) {
    String codedfilename = null;
    try {
    String agent = request.getHeader("USER-AGENT");
    if (null != agent && -1 != agent.indexOf("MSIE") || null != agent
    && -1 != agent.indexOf("Trident")) {// ie
    String name = java.net.URLEncoder.encode(fileNames, "UTF8");
    codedfilename = name;
    } else if (null != agent && -1 != agent.indexOf("Mozilla")) {// 火狐,chrome等
    codedfilename = new String(fileNames.getBytes("UTF-8"), "iso-8859-1");
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return codedfilename;
    }

    //httpConverBytes 方法
    public static byte[] httpConverBytes(String path,HttpServletRequest request) {
    BufferedInputStream in = null;
    ByteArrayOutputStream out = null;
    URLConnection conn = null;
    int httpResult=0;
    try {
    StringBuffer sb = new StringBuffer();
    for(int i=0;i<path.length();i++){
    char a=path.charAt(i);   //url路径的中文部分重新编码 很重要
    if(a>127){//将中文UTF-8编码
    sb.append(URLEncoder.encode(String.valueOf(a), "utf-8"));
    }else{
    sb.append(String.valueOf(a));
    }
    }
    URL url = new URL(sb.toString()); //创建URL
    URLConnection urlconn = url.openConnection(); // 试图连接并取得返回状态码urlconn.connect();
    HttpURLConnection httpconn = (HttpURLConnection) urlconn;
    httpResult = httpconn.getResponseCode();
    in = new BufferedInputStream(httpconn.getInputStream());

    if (httpResult != HttpURLConnection.HTTP_OK){ //不等于HTTP_OK说明连接不成功
    System.out.print("连接失败!");
    }else {
    out = new ByteArrayOutputStream(1024);
    byte[] temp = new byte[1024];
    int size = 0;
    while ((size = in.read(temp)) != -1) {
    out.write(temp, 0, size);
    }
    byte[] content = out.toByteArray();
    return content;
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    finally {
    try {
    in.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    try {
    out.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    return null;
    }


    通过以上处理下划线问题解决了。
     
  • 相关阅读:
    your account already has a valid ios distribution certificate
    uinavigation样式
    phonegap ios默认启动页
    git init出错
    ios assetlibrary
    uitableviewcell高度自适应笔记
    ios frame bounds applicationframe
    java学习笔记
    file not found while xcode archive
    c++回调
  • 原文地址:https://www.cnblogs.com/xifenglou/p/6907042.html
Copyright © 2011-2022 走看看