表单中文件上传和下载

文件上传和下载的实质:文件拷贝

 

文件上传:从本地拷贝到服务器磁盘上   客户端需要编写文件上传表单---->服务端需要编写代码接受上传的文件

文件下载:从服务器磁盘上拷贝到本地磁盘   需要编写服务端的代码,客户端的下载的工作浏览器内核解决的

 

 

文件上传的步骤:(划重点)

1.客端的form表单method="post",enctype="multipart/form-data"(文件上传表单)

2.导入jar包:commons-fileupload-1.2.1.jar,commons-io-1.4.jar

3.服务器端:

1).创建磁盘文件工厂:DiskFileItemFactory

2).创建文件上传核心类:ServletFileUpload

3).解析request集合(有普通表单项,文件项):.parseRequest(request);

4).遍历FileItem集合:List<FileItem>

5).判断普通表单项/文件上传:.isFormField();

	// 接收上传文件
		try {
			// 1.创建磁盘文件工厂
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// 2.创建文件上传核心类
			ServletFileUpload upload = new ServletFileUpload(factory);
			// 3.解析request集合(有普通表单项,文件项)
			List<FileItem> FileItems = upload.parseRequest(request);
			// 4.遍历FileItem集合
			for (FileItem fileItem : FileItems) {
				// 5.判断普通表单项/文件上传
				boolean bool = fileItem.isFormField();
				if (bool) {// 普通表单项
					String name = fileItem.getFieldName();
					String value = fileItem.getString("UTF-8");// 设置普通表单项的编码方式
					System.out.println(name + "----" + value);
				} else {// 文件项
					String filename = fileItem.getName();// 得到文件名称
					InputStream in = fileItem.getInputStream();// 得到文件输入流
					String path = this.getServletContext().getRealPath("/upload");// 文件存放的文件夹地址
					OutputStream out = new FileOutputStream(path + "/" + filename);// 文件存放的地址
					// 文件拷贝的模板代码
					int len = 0;
					byte[] buffer = new byte[1024];
					while ((len = in.read(buffer)) > 0) {
						out.write(buffer, 0, len);
					}
					in.close();
					out.close();
				}
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

 

文件上传API:

//接收上传文件
		try {
		//1.创建磁盘文件工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//设置缓存大小,单位是字节
		factory.setSizeThreshold(1024*1024);
		//设置临时文件目录
		factory.setRepository(new File("/temporaryfile"));
		
		//2.创建文件上传核心类
		ServletFileUpload upload = new ServletFileUpload(factory);
		boolean bool = upload.isMultipartContent(request);//判断否是一个文件上传表单
		upload.setHeaderEncoding("UTF-8");//设置文件名的编码方式
		if(bool){
			//3.解析request集合(有普通表单项,文件项)
			List<FileItem> FileItems = upload.parseRequest(request);
			//4.遍历FileItem集合
			for (FileItem fileItem : FileItems) {
				//5.判断普通表单项/文件上传
				boolean isFormField = fileItem.isFormField();
				if(isFormField){//普通表单项
					String name = fileItem.getFieldName();
					String value = fileItem.getString("UTF-8");//设置普通表单项的编码方式
					System.out.println(name+"----"+value);
				}else{//文件项
					fileItem.delete();//删除临时文件
					String filename = fileItem.getName();//得到文件名称
					InputStream in = fileItem.getInputStream();//得到文件输入流
					String path = this.getServletContext().getRealPath("/upload");//文件存放的文件夹地址
					OutputStream out = new FileOutputStream(path+"/"+filename);//文件存放的地址
					/*//文件拷贝的模板代码
					int len = 0;
					byte[] buffer = new byte[1024];
					while((len=in.read(buffer))>0){
						out.write(buffer, 0, len);
					}*/
					IOUtils.copy(in, out);//文件拷贝(通过工具类)
					in.close();
					out.close();
				}
			}
		}
			
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

文件下载API

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取文件名称
		String filename = request.getParameter("filename");
		System.out.println(filename);
		//要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
		response.setContentType(this.getServletContext().getMimeType(filename));
		//告诉客户端该文件不是直接解析 而是以附件形式打开(下载)
		response.setHeader("Content-Disposition", "attachment;filename="+filename);
		
		//获取文件的绝对路径
		String path = this.getServletContext().getRealPath("/download/"+filename);
		System.out.println(path);
		//获得该文件的输入流
		InputStream in = new FileInputStream(path);
		//获得输出流---通过response获得的输出流 用于向客户端写内容
		ServletOutputStream out = response.getOutputStream();
		//文件拷贝的模板代码
		int len = 0;
		byte[] buffer = new byte[1024];
		while((len=in.read(buffer))>0){
			out.write(buffer, 0, len);
		}
		in.close();
//		out.close();在servlet的response中ServletOutputStream使用完后会自动关闭,因为out是从servlet中获取的
	}

猜你喜欢

转载自blog.csdn.net/langao_q/article/details/81699759