版权声明:本文为博主原创文章,如需转载请附上原文链接。 https://blog.csdn.net/Hi_Boy_/article/details/80525071
需要的jar包:commons-fileupload1.3.jar和commons-io2.6.jar
jar包maven配置方式
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3</version> </dependency>
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
上传文件:
1.controller层写一个fileUpload()方法用来接收前端传过来的图片
@RequestMapping(value = "upload",method = RequestMethod.POST ) public AppResult fileUpload(MultipartFile file){ try { ar = userService.uploadFile(dto,ar); return ar; }catch (Exception e){ e.printStackTrace(); }
注意:参数用MultipartFile 类型来接收,请求方式必须为POST
2.service层用UUID给上传的文件起名字并调用FileUtil类的uploadFileByFilename()方法上传文件
public String uploadFile(MultipartFile file) { //上传文件 String aratarUrl = ""; try { if (file != null && !file.isEmpty()) { String fileName = UUID.randomUUID().toString().trim(); aratarUrl = FileUtil.uploadFileByFilename(file,fileName); } }catch (Exception e){ e.printStackTrace(); } }
3.FileUtil工具类中
/** * 文件请求地址 */ private static final String SERVER_ADDRESS = download/pic?fileName=; /** * 文件存储地址 */ private static final String FILE_ADDRESS = F:/PIC/;
public static String uploadFileByFilename(MultipartFile file , String name) throws IOException { //获得上传时的文件原名 String fileName = file.getOriginalFilename(); //从文件名中截取后缀名已获得文件类型 String fileType=fileName.substring(fileName.lastIndexOf('.')+1,fileName.length()); return getAnduploadFilename(file.getBytes(), fileType,name ); }
public static String getAnduploadFilename(byte[] bytes,String fileType,String name) throws IOException { File fa = new File(FILE_ADDRESS); //判断是否存在该文件如果不存在则创建该文件 if(!fa.exists()){ fa.mkdirs(); } //文件全路径名 String fullName =FILE_ADDRESS + name + "." + fileType; //从服务器下载该文件的url地址 String serverName = SERVER_ADDRESS + name + "." + fileType; File file = new File(fullName); //用 org.apache.commons.io包中FileUtils类的writeByteArrayToFile()方法 //将文件写入到服务器地址(SERVER_ADDRESS)对应的位置 FileUtils.writeByteArrayToFile(file, bytes); return serverName; }
至此文件上传成功 文件已保存到 FILE_ADDRESS 对应的文件夹下
下载文件:
1.controller层中写一个文件下载controller
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; /** * @author [email protected] * @date 2018/5/31 13:27 */ @RestController @RequestMapping("download") public class DownloadFileController { @RequestMapping(value = "pic",method = RequestMethod.GET) public void downloadPic(HttpServletResponse response, String fileName){ FileInputStream fis = null; OutputStream out = null; try { //设置响应格式 response.setContentType("image/gif"); //到FileUtil工具类中加载文件 File file = FileUtil.downloadFile(fileName); //获得response的输出流 out = response.getOutputStream(); fis = new FileInputStream(file); byte[] b = new byte[fis.available()]; //读取文件并写入到response响应中 fis.read(b); out.write(b); out.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (fis != null) fis.close(); if (out != null) out.close(); }catch (IOException e){ e.printStackTrace(); } } } }
2.FileUtil中downloadFile(fileName)方法如下
/** * 下载文件 * @param fileName * @return */ public static File downloadFile(String fileName){ return new File(FILE_ADDRESS + fileName); }至此文件下载也编写完成;
实质上文件上传和下载都是通过IO流来读写文件。
文件上传可以理解为从客户端读文件然后写到服务器的指定文件夹。
文件下载可以理解为从服务器读文件然后写到客户端的指定文件夹。
注意:文件上传下载是http请求的content-type要设置为multipart/form-data类型,请求方式为POST方式
最后一步:设置multipart类型的解析器
springMVC框架设置方法
在SpringMVC的配置文件中加入如下配置
<!-- 配置多媒体文件解析器 -->
<!-- 文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置上传文件的最大尺寸为5MB --> <property name="maxUploadSize"> <value>5242880</value> </property> </bean>
springBoot框架设置方法 :服务启动类中加上如下方法
//显示声明CommonsMultipartResolver为mutipartResolver @Bean(name = "multipartResolver") public MultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setDefaultEncoding("UTF-8"); //resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常 resolver.setResolveLazily(true); resolver.setMaxInMemorySize(40960); resolver.setMaxUploadSize(5 * 1024 * 1024);//上传文件大小 5M 5*1024*1024 return resolver; }
类名上方加上如下注解
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
说明:文件上传时的 SERVER_ADDRESS 文件下载时的url地址