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