SpringMvc文件的上傳與下載(二)下載

//   下載文件
@RequestMapping("/downloadfile")
public String downloadfile(HttpServletRequest request, HttpServletResponse response, Model model) {

    String realPath = request.getServletContext().getRealPath("uploadfiles");
//        這是獲取到uploadfiles目錄下的所有的文件
    File fileDir = new File(realPath);
    File[] files = fileDir.listFiles();

    ArrayList<String> fileNames = new ArrayList<String>();
    for (File file : files) {
        fileNames.add(file.getName());
    }
    model.addAttribute("filenames", fileNames);
//        文件下載
    String filename = request.getParameter("filename");
    System.out.println("獲取到的參數===" + filename.toString());

    if (filename != "") {
        String filePath = null;
        FileInputStream in = null;
        ServletOutputStream out = null;

    /**  需要設置兩個報頭
     *    application/x-msdownload  表明是一個要下載文件
     *    設置接收數據的方式,將文件保存爲文件中的文件名稱  並解決漢字文件名出現的亂碼問題  但是火狐仍爲亂碼....
     */
        response.setHeader("Content-Type", "application/x-msdownload");
        //            response.setHeader("Content-Disposition", "attachment;filename=" + toUTF8String(filename));
        response.setHeader("Content-Disposition", "attachment;filename=" + toUTF8String(request, filename));


        try {

            in = new FileInputStream(realPath + "\\" + filename);
            out = response.getOutputStream();
            out.flush();
            int aRead = 0;
            byte b[] = new byte[1024];
            while ((aRead = in.read(b)) != -1 & in != null) {
                out.write(b, 0, aRead);
            }
            out.flush();
            in.close();
            out.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    return "success";
}

  //經測試,能在谷歌和火狐上正常使用
  private String toUTF8String(HttpServletRequest request, String fileName) {
    try {
        String agent = request.getHeader("User-Agent");
        if (agent.contains("Firefox")) {
            //火狐
            fileName = "=?utf-8?B?" + new BASE64Encoder().encode(fileName.getBytes("utf-8")) + "?=";
        } else {
            fileName = URLEncoder.encode(fileName, "UTF-8");
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return fileName;
}


//    網上的 將中文轉化爲utf-8工具類  不可取
private String toUTF8String(String s) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c >= 0 && c <= 255) {
            sb.append(c);
        } else {
            byte[] b;
            try {
                b = Character.toString(c).getBytes("utf-8");
            } catch (Exception ex) {
                System.out.println(ex);
                b = new byte[0];
            }
            for (int j = 0; j < b.length; j++) {
                int k = b[j];
                if (k < 0) k += 256;
                sb.append("%" + Integer.toHexString(k).
                        toUpperCase());
            }
        }
    }
    return sb.toString();
}

2.可在jsp中利用post進行提交

<form action="${pageContext.request.contextPath}/downloadfile" method="post" enctype="multipart/form-data">
    <input type="text" name="filename">
    <input type="submit" value="下載">
</form>

或是通過get請求也可以

http://localhost:8080/downloadfile/filename=20191120142438245.png

項目地址: https://gitee.com/yuexingyingxue/springMvcTest1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章