ファイルのダウンロード - サーバーサイドのプログラミング動作

创建DownloadServlet
	// 1.得到要下载 的文件名称
	String filename = request.getParameter("filename");
	
	//2.判断文件是否存在
	File file = new File("d:/upload/" + filename);
	if (file.exists())

	//3.进行下载 
		原理:就是通过response获取一个输出流,将要下载的文件内容写回到浏览器端就可以了.
		
注意:要想通过编程的方式,实现文件下载,
	1.要设置mimetype类型
		resposne.setContextType(String mimeType);
		
		问题:怎样可以得到要下载文件的mimeType类型?
			ServletContext.getMimeType(String filename);
			
		如果设置了mimeType,浏览器能解析的就直接展示了,不能解析的,直接下载.
		
	2.设置一个响应头,设置后的效果,就是无论返回的是否可以被浏览器解析,就是下载 。
		response.setHeader("content-disposition","attachment;filename=下载文件名称");
		
总结:服务器端编程下载:
	1.将下载的文件通过resposne.getOutputStream()流写回到浏览器端。
	2.设置mimeType  response.setContentType(getServletContext.getMimeType(String filename));
	3.设置响应头,目的是永远是下载操作
		response.setHeader("content-disposition","attachment;filename=下载文件名称");

ファイルサーバを読み込むサーバプログラムを書いて、ダウンロードが完了すると

それから二つのヘッダ、Content-Typeのコンテンツの廃棄MIMEプロトコルを提供しなければなりません

 

response.setContentType(のgetServletContext()のgetMimeType(ファイル名)。);

response.setHeader(「コンテンツの廃棄」、「添付ファイル;ファイル名=」+ファイル名); //は関係なく、添付ファイルを開くブラウザ識別フォーマットかどうか

package cn.learn.web.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;

public class DownloadServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 1.得到要下载 的文件名称
		String filename = request.getParameter("filename");

		filename = new String(filename.getBytes("iso8859-1"), "utf-8");// 解决中文乱码

		// 2.在d:/upload目录下查找这个文件是否存在
		File file = new File("d:/upload/" + filename);
		if (file.exists()) {
			// /文件存在,完成下载

			// 下载注意事项1--设置下载文件的mimeType
			String mimeType = this.getServletContext().getMimeType(filename);
			response.setContentType(mimeType);

			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");
			}

			// 下载注意事项2--永远是下载
			response.setHeader("content-disposition", "attachment;filename="
					+ filename);

			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();

		} else {
			throw new RuntimeException("下载资源不存在.");
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

 

リリース2417元の記事 ウォン称賛62 ビュー20万+

おすすめ

転載: blog.csdn.net/Leon_Jinhai_Sun/article/details/105162071