springmvc 上传和下载

1、上传—jar包:commons-fileupload、commons-io
1)页面:表单–post、multipart/form-data
2)页面:表单中设置input—file类型
3)解析器—上传解析器—实现解析,将客户端送到服务器端的字符串解析
4)在处理请求的执行单元中添加形参来接收文件和非文件数据

2、实现
1)页面

<form action="upload.action" method="post" enctype="multipart/form-data">
	<p>pid<input type="text" name="pid"></p>
	<p>name<input type="text" name="pname"></p>
	<p>weight<input type="text" name="weight"></p>
	<p>photo<input type="file" name="photo"></p>
	<p><input type="submit" value="提交"></p>
</form>

2)解析器

<!-- 上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<property name="defaultEncoding" value="utf-8"></property>
</bean>

3)执行单元

@RequestMapping("/upload.action")
	public String upload(Person person,MultipartFile[] photo) throws IllegalStateException, IOException {
		System.out.println("person里面只有一般数据:"+person);
		
		for(int i = 0;i < photo.length;i++) {
			MultipartFile mf = photo[i];
			//当数组中有上传的内容时,才处理,否则不处理,不然抛出空指针
			if(mf != null) {
				//获取上传文件的名称
				String fileOldName = mf.getOriginalFilename();
				person.setPhotoOldName(fileOldName);
				//重名问题:随机名称
				//判断是否存在路径,其次进行截取;然后截取扩展名;拼合新名称
				//D:\cts第三阶段录屏\day08\1.jpg
//				int i1 = fileOldName.lastIndexOf("\\");
//				if(i1 != -1) {
//					fileOldName = fileOldName.substring(i1 + 1);
//				}
				int i2 = fileOldName.lastIndexOf(".");
				String ext = fileOldName.substring(i2);
				
				String uuid = UUID.randomUUID().toString();
				String fileNewName = uuid + ext;
				person.setPhotoNewName(fileNewName);
				
				
				//获取指定路径
				File file = new File("C:\\Users\\IBM\\Desktop\\imgs",fileNewName);
				
				//实现将上传的文件复制到指定的路径
				mf.transferTo(file);
			}
		}
		return "/main.jsp";
	}

3、上传的时候,可以设置上传文件的最大大小限制

<!-- 上传解析器 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设置上传文件的最大值限制,单位:B -->
		<property name="maxUploadSize" value="10285760"></property>
		<property name="defaultEncoding" value="utf-8"></property>
	</bean>

4、下载
1)展示下载列表,然后点击下载
2)实现下载列表:
执行单元

@RequestMapping("/list.action")
	public String list(Model model) {
		//加入在files中保存着所有的下载文件的名称
		//找到路径---文件所在
		File file = new File("C:\\Users\\IBM\\Desktop\\imgs");
		//获取路径中所有文件的名称---递归
		String[] files = file.list();
		model.addAttribute("files", files);
		return "/downlist.jsp";
	}

页面

<p>下载列表</p>
<c:forEach items="${files }" var="file">
	<p><a href="download.action?fname=${file }">${file }</a></p>
</c:forEach>

下载执行单元

@RequestMapping("/download.action")
	//原生态的方式
	public void download(String fname,HttpServletRequest request,HttpServletResponse response) throws IOException {
		File file = new File("C:\\Users\\IBM\\Desktop\\imgs",fname);
		//在下载时,可能存在中文乱码,如何处理
		String name = fname;
		name = new String(name.getBytes("utf-8"),"iso8859-1");
		//从服务器端送给客户端文件
		//一个头、两个流
		InputStream is = null;
		OutputStream os = null;
		//作用是设置下载的时候文件名称
		response.setHeader("content-Disposition", "attachment;fileName="+name);
		is = new BufferedInputStream(new FileInputStream(file));
		os = response.getOutputStream();
		byte[] bs = new byte[1024];
		int len = -1;
		while((len = is.read(bs))!=-1) {
			os.write(bs, 0, len);
		}
	}

下载执行单元的新方式
//下载实现的新方式

@RequestMapping("/download.action")
	public ResponseEntity<byte[]> download(String fname) throws IOException{
		//找到文件所在路径
		File file = new File("C:\\Users\\IBM\\Desktop\\imgs",fname);
		//处理可能存在中文乱码问题
		String name = fname;
		name = new String(name.getBytes("utf-8"),"iso8859-1");
		//准备响应头
		HttpHeaders header = new HttpHeaders();
		header.setContentDispositionFormData("attachment", name);
		//响应内容的类型
//		header.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
		//实现返回
		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), header, HttpStatus.OK);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值