欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springmvc实现文件上传和下载

程序员文章站 2022-04-30 22:42:56
...

springmvc实现文件上传的步骤:


1.页面上,通过input来准备file组件,该标签,必须给定name属性值(该name不能和实体类的属性名一致)
同时,要求form表单必须给定一个属性:enctype="multipart/form-data"

	<form action="uc/adduser" method="post" enctype="multipart/form-data">
		<p>
			用户名:<input type="text" name="loginname" id="loginname" />
		</p>
		<p>
			密码:<input type="text" name="loginpwd" id="loginpwd" />
		</p>


		<p>
			头像:<input type="file" name="pic" id="pic" />
		</p>


		<p>
			<input type="submit" value="注册" />
		</p>


	</form>




2.在pom.xml文件中,添加文件上传的第三方工具:
commons-fileupload-1.3.2.jar
commons-io-2.2.jar

	<!-- 文件上传依赖(该依赖下载时,commons-io-2.2.jar也随着添加到依赖中) -->
		<dependency>
		    <groupId>commons-fileupload</groupId>
		    <artifactId>commons-fileupload</artifactId>
		    <version>1.3.2</version>
		</dependency>



3.在app-springmvc.xml配置文件中,准备上传操作的对象:CommonsMultipartResolver
在这个对象中,我们可以对文件大小,编码方式等进行设定

	<!-- 图片上传 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!--每个文件上传大小-->
		<property name="maxUploadSizePerFile" value="102400000"></property>
	</bean>



4.在控制器中,通过@RequestParam MultipartFile pic这种方式,来接收页面传递的文件,这里,参数的名字必须与页面上file组件的name属性值一致
此时,在控制器中,已经能够正常地接收页面上传的文件了,下一步,只需要把接收的这个文件,保存到服务器的硬盘上即可(在项目根目录下创建一个upload文件夹存储上传的文件)

控制器代码:

@RequestMapping(value = "adduser", method = RequestMethod.POST)
	public String addUser(Users users,
			@RequestParam MultipartFile pic, HttpServletRequest request,
			Model model) {

		// 原始上传文件名字
		String filename = pic.getOriginalFilename();
		// 文件类型
		String contentType = pic.getContentType();

		InputStream is = null;
		OutputStream os = null;
		// 上传目录的绝对路径
		String realpath = request.getSession().getServletContext()
				.getRealPath("/upload");
		// 得到一个随机的字符串作为上传文件的新名字(防止文件因名字相同而覆盖)
		String uuid = UUID.randomUUID().toString();
		// 获得文件的后缀名
		String endname = filename.substring(filename.lastIndexOf("."),
				filename.length());

		// 要把文件输出到硬盘上有两种方式
		// 方式一:自己写字节流 并通过边读边写操作完成输出
		// try {
		// is = pic.getInputStream();
		// os = new FileOutputStream(new File(realpath + "/" + uuid + endname));
		// byte[] b = new byte[1024];
		// int len = is.read(b);
		// while (len != -1) {
		// os.write(b, 0, len);
		// len = is.read(b);
		// }
		// } catch (IOException e1) {
		// e1.printStackTrace();
		// } finally {
		// try {
		// os.flush();
		// os.close();
		// is.close();
		// } catch (IOException e) {
		// e.printStackTrace();
		// }
		// }

		// 方式二、通过commons-io包提供的工具来完成拷贝
		try {
			is = pic.getInputStream();
			os = new FileOutputStream(new File(realpath + "/" + uuid + endname));
			FileCopyUtils.copy(is, os);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				os.flush();
				os.close();
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		// 上传完成后,还需要把文件路径和名字保存到user对象中,然后把user对象的信息,保存到数据库中
		// 下次能够根据数据库的记录,来找到对应的文件
		users.setPicpath(uuid + endname);
		boolean flag = userServiceImpl.addUser(users);
		if (flag) {
			model.addAttribute("mypic", uuid + endname);
			return "add_suc";
		}
		return "index";
	}



SpringMVC 文件下载核心代码:


页面中将需要下载的文件的名字参数传输到控制器中,在控制器中的代码如下(文件保存在项目根目录的upload文件夹里面):

/**
	 * 实现下载的步骤: 1、需要把数据以流的形式响应到页面 2、需要在页面上打开Content-disposition=attachment
	 * 
	 * @return
	 */
	@RequestMapping(value = "downloadfile")
	public ResponseEntity<byte[]> downloadFile(String mypicname,
			HttpServletRequest request) {
		// 读取文件保存的根位置
		String realPath = request.getSession().getServletContext()
				.getRealPath("/upload");
		File file = new File(realPath + "/" + mypicname);
		HttpHeaders header = new HttpHeaders();
		header.setContentDispositionFormData("attachment", mypicname);
		ResponseEntity<byte[]> re = null;
		try {
			re = new ResponseEntity<byte[]>(
					FileUtils.readFileToByteArray(file), header, HttpStatus.OK);
		} catch (IOException e) {
			e.printStackTrace();
		}

		return re;

	}