web--3.文件下载

来源:互联网 发布:淘宝放心淘是正品吗 编辑:程序博客网 时间:2024/06/11 12:11

 

1      文件下载的方式:

                   1.超连接下载

                   2.服务器端通过流下载(服务器端编程)

 

 

2      超链接下载

 

         注意:如果文件可以直接被浏览器解析,那么会在浏览器中直接打开,不能被浏览器直接解析,就是下载操作。直接打开的要想下载,右键另存为。

         超连接下载,要求下载 的资源,必须是可以直接被浏览器直接访问的。

         客户端访问服务器静态资源文件时,静态资源文件是通过 缺省Servlet返回的,

         在tomcat配置文件conf/web.xml找到 --- org.apache.catalina.servlets.DefaultServlet

 

 

3      在服务器端编程完成下载.

3.1  创建download2.jsp

 

3.2  创建DownloadServlet

                            //1.得到要下载 的文件名称

                            Stringfilename = request.getParameter("filename");

                           

                            //2.判断文件是否存在

                            Filefile = new File("d:/upload/" + filename);

                            if(file.exists())

                  

                            //3.进行下载

                                     原理:就是通过response获取一个输出流,将要下载的文件内容写回到浏览器端就可以了.

                                    

注意:要想通过编程的方式,实现文件下载,

         1.要设置mimetype类型

                   resposne.setContextType(StringmimeType);

                                    

问题:怎样可以得到要下载文件的mimeType类型?

                   ServletContext.getMimeType(Stringfilename);

                   如果设置了mimeType,浏览器能解析的就直接展示了,不能解析的,直接下载.

                                    

         2.设置一个响应头,设置后的效果,就是无论返回的是否可以被浏览器解析,就是下载。

                   response.setHeader("content-disposition","attachment;filename=下载文件名称");

                                    

总结:服务器端编程下载:

         1.将下载的文件通过resposne.getOutputStream()流写回到浏览器端。

         2.设置mimeType 

                   response.setContentType(getServletContext.getMimeType(Stringfilename));

         3.设置响应头,目的是永远是下载操作

                   response.setHeader("content-disposition","attachment;filename=下载文件名称");

                                    

                   --------------------------------------

3.3  文件下载时的乱码问题:

                           

3.3.1   关于下载时中文名称资源查找不到

原因:

         <ahref='${pageContext.request.contextPath}/download?filename=天空.mp3'>天空.mp3</a>

                                       这是get请求。

                                      

                                       在服务器端:

                                       String filename =request.getParameter("filename");

                                      

                                      解决: newString(filename.getBytes("iso8859-1"),"utf-8");

                                      

3.3.2   下载文件显示时的中文乱码问题

response.setHeader("content-disposition","attachment;filename="+filename);

                                              

                                               IE:要求filename必须是utf-8码

                                               firefox:要求filename必须是base64编码.

                                              

                                               问题:怎样判断浏览器?

                                                        Stringagent=request.getHeader("user-agent");

                                              

                                                        if(agent.contains("MSIE")) {

                                                                 //IE浏览器

                                                                 filename= URLEncoder.encode(filename, "utf-8");

                                                                

                                                        }else if (agent.contains("Firefox")) {

                                                                 //火狐浏览器

                                                                 BASE64Encoderbase64Encoder = new BASE64Encoder();

                                                                 filename= "=?utf-8?B?"

                                                                                    +base64Encoder.encode(filename.getBytes("utf-8"))

                                                                                    +"?=";

                                                        }else{

                                                                 //其它浏览器

                                                                 filename= URLEncoder.encode(filename, "utf-8");

                                                        }

 

 

 

public class FileDownUtils {//适应各种浏览器public static String adaptiveBrowser(HttpServletRequest request, String filename)throws UnsupportedEncodingException {String agent = request.getHeader("user-agent");if (agent.contains("MSIE")) {// IE浏览器filename = URLEncoder.encode(filename, "utf-8");} else if (agent.contains("Firefox")) {// 火狐浏览器BASE64Encoder base64Encoder = new BASE64Encoder();filename = "=?utf-8?B?"+ base64Encoder.encode(filename.getBytes("utf-8"))+ "?=";} else {// 其它浏览器filename = URLEncoder.encode(filename, "utf-8");}return filename;}public static void foreverDown(HttpServletResponse response, String filename) {// 下载注意事项2--永远是下载response.setHeader("content-disposition", "attachment;filename="+ filename);}public static void downFile(HttpServletResponse response, File file)throws FileNotFoundException, IOException {FileInputStream fis = new FileInputStream(file); // 读取要下载文件的内容OutputStream os = response.getOutputStream(); // 将要下载的文件内容通过输出流写回到浏览器端.int len = -1;byte[] b = new byte[1024 * 100];while ((len = fis.read(b)) != -1) {os.write(b, 0, len);os.flush();}os.close();fis.close();}}

 

 

 

 

 源代码文件:http://download.csdn.net/detail/qq_26553781/9848201