Servlet系列之(2)文件下載

文件下載理解: 將服務(wù)器端資源以流的形式寫入到瀏覽器中

1.通過超鏈接下載

注意: 如果瀏覽器可以解析,則會直接在瀏覽器中打開。例如,在chrome可以直接解析 圖片 和 pdf 文件,就不會彈出下載窗口


public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String path = getServletContext().getRealPath("/WEB-INF/classes/秋瓷炫.jpg");
        int index = path.lastIndexOf("\\");
        String name = path.substring(index+1);

        InputStream is = new FileInputStream(path);
        ServletOutputStream outputStream = resp.getOutputStream();
        int len = 0;
        byte[] bys = new byte[1024];
        while((len=is.read(bys))!=-1){
            outputStream.write(bys,0,len);
        }
        is.close();
        outputStream.close();

    }
}

2. 強(qiáng)制彈出下載窗口

在獲取輸出流之前加上:

response.setHeader("Content-Disposition", "attachment;filename="+filename);

文件名為中文時(shí)亂碼處理

filename 如果是中文,會導(dǎo)致瀏覽器解析時(shí)亂碼, 如下


image.png

解決辦法:
方法一:

拿到瀏覽器請求的usreAgent,判斷是否包含MSIE, 如果有,URLEncode(filename,"GBK")
沒有的話,URLEncoder.encode(filename)

 String agent = req.getHeader("User-Agent");
 System.out.println(agent);
 if(agent.indexOf("MSIE")!=-1){
      name =URLEncoder.encode(name,"GBK");
}else{
      name=URLEncoder.encode(name,"UTF-8");
}
resp.setHeader("Content-Disposition", "attachment;filename="+name);
image.png

方法二:

  1. 拿到瀏覽器請求的usreAgent,判斷是否包含MSIE,則將文件名以 gbk 編碼(getBytes("GBK")) , 不包含MSIE則以 “UTF-8”編碼(getBytes("UTF-8"))

  2. 然后將bytes使用ISO-8859-1解碼轉(zhuǎn)換為字符串,返回到瀏覽器。各瀏覽器基本都支持ISO編碼

轉(zhuǎn)換過程
中文 -> UTF-8 編碼 ->二進(jìn)制-> ISO-8859-1編碼->發(fā)送到客戶端 -> 客戶端 將字符串 以ISO8859-1 編碼->二進(jìn)制-> 再以UTF-8 解碼

 String userAgent = request.getHeader("User-Agent"); 
// name.getBytes("UTF-8")處理safari的亂碼問題 
 byte[] bytes = userAgent.contains("MSIE") ? name.getBytes("GBK") : name.getBytes("UTF-8");                     

 // 各瀏覽器基本都支持ISO編碼
name = new String(bytes, "ISO-8859-1");  

// 文件名外的雙引號處理firefox的空格截?cái)鄦栴} 
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", name));   

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容