servlet+jsp实现的文件上传与下载

java文件上传与下载

通过微表单元苏设置Method = "post"

enctype = "multipart/form-data"属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的Servlet

中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。

表单ENCTYPE属性

application/x-www-form-urlencoded :这是默认的编码方式,它只处理表单域里的value属性值。采用

这种编码方式的表单会将表单域的值处理成URL编码方式

multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域

指定文件的内容也封装到请求参数里

text/plain:这种方式主要适用于直接通过表单发送邮件的方式

文件下载

需要通过HttpServletResponse.setContentType方法设置Content-Type头字段的值,

为浏览器无法使用某种方式或激活某个程序来处理的MIME类型

需要通过HttpServletResponse.setHeader方法设置Content-Disposition头的值为

“attachment;filename=文件名”;

读取下载文件,调用HttpServletResponse.getOutputStream方法返回的ServletOutputStream

对象来向客户端写入附件文件内容

文件上传实现步骤

获取request当中的流信息,保存到临时文件

从临时文件当中得到上传的文件名,及文件内容起止位置

根据文件起止位置,读取上传文件内容,保存到本地

Jsp页面

<form action="uploadServlet.do" method="post"
		enctype="multipart/form-data">
		<input id="myfile" name="myfile" type="file"
			 /> <input type="submit" value="提交" />${result}
	</form>
	下载:
	<a href="downloadServlet.do?filename=test1.txt">test1.txt</a>
	   ${errorResult}

上传

public class UploadServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req,resp);
	}

	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//从request当中获取流信息
		InputStream fileSource = req.getInputStream();
		String tempFileName = "E:/tempFile";
		//tempFile指向临时文件
		File tempFile = new File(tempFileName);
		//outputStram文件输出流指向这个临时文件
		FileOutputStream outputStream = new FileOutputStream(tempFile);
		byte b[] = new byte[1024];
		int n;
		while(( n = fileSource.read(b)) != -1){
			outputStream.write(b, 0, n);
		}
		//关闭输出流、输入流
		outputStream.close();
		fileSource.close();

		//获取上传文件的名称
		RandomAccessFile randomFile = new RandomAccessFile(tempFile,"r");
//		l = new String(l.getBytes("8859_1"),"gbk");
		String str2 = randomFile.readLine();
		//编码转换
		str2 = new String(str2.getBytes("8859_1"),"utf-8");
		System.out.println(str2);
		String str = randomFile.readLine();
		str = new String(str.getBytes("8859_1"),"utf-8");
		System.out.println(str);
		int beginIndex = str.lastIndexOf("=") + 2;
		int endIndex = str.lastIndexOf("\"");
		String filename = str.substring(beginIndex, endIndex);
		System.out.println("filename:" + filename);

		//重新定位文件指针到文件头
		randomFile.seek(0);
		long startPosition = 0;
		int i = 1;
		//获取文件内容 开始位置
		while(( n = randomFile.readByte()) != -1 && i <=4){
			if(n == '\n'){
				startPosition = randomFile.getFilePointer();
				i ++;
			}
		}
		startPosition = randomFile.getFilePointer() -1;
		//获取文件内容 结束位置
		randomFile.seek(randomFile.length());
		long endPosition = randomFile.getFilePointer();
		int j = 1;
		while(endPosition >=0 && j<=2){
			endPosition--;
			randomFile.seek(endPosition);
			if(randomFile.readByte() == '\n'){
				j++;
			}
		}
		endPosition = endPosition -1;

		//设置保存上传文件的路径
		//路径可以自行设置
		String realPath = "E:\\myeclipse workplace\\css+js";
//		String realPath = getServletContext().getRealPath("/") + "images";
		File fileupload = new File(realPath);
		System.out.println(realPath);
		if(!fileupload.exists()){
			fileupload.mkdir();
		}
		File saveFile = new File(realPath,filename);
		RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");
		//从临时文件当中读取文件内容(根据起止位置获取)
		randomFile.seek(startPosition);
		while(startPosition < endPosition){
			randomAccessFile.write(randomFile.readByte());
			startPosition = randomFile.getFilePointer();
		}
		//关闭输入输出流、删除临时文件
		randomAccessFile.close();
		randomFile.close();
		tempFile.delete();

		req.setAttribute("result", "上传成功!");
		RequestDispatcher dispatcher = req.getRequestDispatcher("test.jsp");
		dispatcher.forward(req, resp);
	}
}

下载文件

public class DownLoadServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
//		req.setCharacterEncoding("utf-8");
//		resp.setCharacterEncoding("utf-8");
//		resp.setContentType("text/html;charset=utf-8");
//		req.setCharacterEncoding("utf-8");
//		resp.setContentType("text/html;charset=UTF-8");
//		  resp.setContentType("text/plain");
		//进行编码的转换,因为不能识别中文
		resp.setHeader("content-type","text/html;charset=UTF-8");
		String path = getServletContext().getRealPath("/") + "images/";
		String fileName = req.getParameter("filename");
		String filename = null;
		filename = new String(fileName.getBytes("8859_1"),"utf-8");
//		filename = new String(filename.getBytes("8859_1"),"uft-8");
		System.out.println("路径:" + path + "文件名:" + filename);
		File file = new File(path + filename);
		if (file.exists()) {
			//由于下载的时候与浏览器的编码不符,浏览器不能识别中文编码,这里要进行转换
			String value = new String(filename.getBytes("utf-8"),"ISO-8859-1");
			resp.setContentType("application/x-msdownload");
			resp.setHeader("Content-Disposition", "attachment;filename=\""
					+ value + "\"");
			InputStream inputStream = new FileInputStream(file);
			ServletOutputStream outputStream = resp.getOutputStream();
			byte b[] = new byte[1024];
			int n;
			while ((n = inputStream.read(b)) != -1) {
				outputStream.write(b, 0, n);
			}

			outputStream.close();
			inputStream.close();
		} else {
			req.setAttribute("errorResult", "文件不存在下载失败!!");
			resp.sendRedirect("luntan.jsp");
		}
	}

	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}

}
时间: 2024-10-19 02:20:17

servlet+jsp实现的文件上传与下载的相关文章

使用jsp/servlet简单实现文件上传与下载

使用JSP/Servlet简单实现文件上传与下载 通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用jsp与servlet实现文件上传与下载. 在写代码之前,我们需要导入两个额外的jar包,一个是common-io-2.2.jar,另一个是commons-fileupload-1.3.1.jar,将这个两个jar 包导入WEB-INF/lib目录里. 首先,想要在web端即网页上实现文件上传,必须要提供

springmvc和servlet下的文件上传和下载(存文件目录和存数据库Blob两种方式)

项目中涉及了文件的上传和下载,以前在struts2下做过,今天又用springmvc做了一遍,发现springmvc封装的特别好,基本不用几行代码就完成了,下面把代码贴出来: FileUpAndDown.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"%> <html> <head> <title>using commons Uplo

jsp文件上传、下载

一.文件上传 上传文件是Web开发中经常要用到的功能:例如在基于B/S的人事信息管理系统中上传照片,在新闻发布系统中上传图片等等.....要实现文件上传功能,就需要综合利用java中的文件输入和输出相关的类. 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客服端发送到服务器的标准机制,能够考虑到跨平台的文本和二进制格式文件.但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp 运行机制所决定的. 下面是上传文件的jsp页面: [html] view plaincopypr

JavaWeb学习总结(五十)——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

深入分析JavaWeb Item40 -- 文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

JavaWeb文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请 求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common- fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,st

FileUpload系列:(3)文件上传和下载示例

示例由1个Servlet和3个JSP组成. 1.FileServlet package com.rk.web.servlet; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.Has

JavaWeb学习总结,文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

java里面的文件上传与下载

文件的上传与下载主要用到两种方法:1.方法一:commons-fileupload.jar commons-io.jarapache的commons-fileupload实现文件上传,下载 [upload]package com.handson.bbs.servlet; import java.io.File;import java.io.IOException;import java.util.Date;import java.util.List;import javax.servlet.Se