本文主要是介绍Spring Boot文件上传和下载,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- Spring Boot 文件上传
1.1 创建springboot项目,引入web和thymeleaf启动器坐标
1.2 编写文件上传的视图层thymeleaf页面。index.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>文件上传和下载的页面</title> </head> <body> <form th:action="@{/fileUpload}" method="post" enctype="multipart/form-data"> 文件上传:<input type="file" name="file" /> <input type="submit" value="提交" /> </form> </body> </html>
|
1.3 编写访问thymeleaf页面的控制器方法
由于template目录是安全目录,该目录下所有的thymeleaf页面都不能直接访问,必须通过控制器才能访问。
@Controller public class FileUpDownController {
@RequestMapping("/{page}") public String path(@PathVariable String page){ return page; } }
|
1.4 编写实现控制文件上传的控制器方法
/** * 实现文件上传 * @param file 上传的文件对象 */ @RequestMapping("/fileUpload") @ResponseBody public String fileUpload(MultipartFile file){ try { //path:目标目录 File path=new File("src/main/resources/static/files"); if(!path.exists()){ path.mkdirs(); } String oldName=file.getOriginalFilename(); String fileName= UUID.randomUUID().toString().substring(0,18)+oldName.substring(oldName.lastIndexOf(".")); //descFile:目标目录=文件夹名+文件名 File descFile=new File(path.getAbsolutePath()+"/"+fileName); //将上传的文件保存到指定的目标目录下 file.transferTo(descFile); return "文件上传成功"; } catch (IOException e) { e.printStackTrace(); return "文件上传失败"; } }
|
1.5文件上传配置,全局配置文件application.properties
默认spring boot 文件上传单个文件的大小为1MB
默认spring boot 文件上传总文件的大小为10MB
#配置单个文件的最大大小 spring.servlet.multipart.max-file-size=20MB #设置文件的总大小 spring.servlet.multipart.max-request-size=100MB
|
- Spring Boot 文件下载
2.1 页面部分
<a th:href="@{/downLoad(filename='417f0b50-8dec-4b77-8a9c-73ff4a2b4cf9.jpg')}" >下载417f0b50-8dec-4b77-8a9c-73ff4a2b4cf9.jpg</a> <a th:href="@{/downLoad(filename='27e8460b-1e75-4a16.sql')}" >下载sql</a>
|
2.2 控制器实现文件下载
/** * 文件下载 */ @RequestMapping("/downLoad") public void downLoad(String filename, HttpServletResponse response){ try { //根据文件名,找到目标目录下的文件 File file=new File("src/main/resources/static/files/"+filename); //设置响应头,以附件的形式下载 response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8")); //将目标文件复制一份,通过response以流的形式输出 IOUtils.copy(new FileInputStream(file),response.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } }
|
- Spring Boot 实现跨服务器文件上传
3.1 结构图
3.2 创建文件服务器,maven的web项目,存放上传的文件服务器
项目名:fileupload_server
在项目的webapp目录下,创建一个files的目录,存放上传的文件
注意:往files中先默认放一张图片,否则files文件编译后不会保留
项目发布到tomcat服务器上,并启动。注意修改端口和jmx
3.3 创建实现文件上传的服务器,实现跨服务器文件上传的代码
3.3.1 打开pom.xml文件,引入跨服务器的坐标
<!--跨服务器文件上传,引入jersey的相关坐标--> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.18.1</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.18.1</version> </dependency>
|
3.3.2 页面核心代码
<form th:action="@{/fileUpload2}" method="post" enctype="multipart/form-data"> 文件上传:<input type="file" name="file" /> <input type="submit" value="提交" /> </form>
|
3.3.3 application.properties配置文件
#上传的服务器的目标地址 server.file.path=http://localhost:9090/fileupload_server/files/
|
3.3.4 控制器核心代码
@Value("${server.file.path}") String path; /**跨服务器的文件上传*/ @RequestMapping("/fileUpload2") @ResponseBody public String fileUpload2(MultipartFile file) throws IOException { System.out.println("跨服务器文件上传"); //文件名 String fileName=file.getOriginalFilename(); //创建客户端对象 Client client=Client.create(); //和图片服务器建立连接 WebResource webResource=client.resource(path+fileName); //上传文件到图片服务器 webResource.put(file.getBytes()); return "文件上传成功!"; }
|
3.3.4 测试,发现出现报错
原因:
只要我们关联了服务器地址之后就可以直接通过put方法把文件上传上去,这无疑是非常危险的行为。因为在上传过程中并没有进行用户校验,那么如果被人知道了服务器保存图片的路径,甚至不需要知道准确路径,只要知道服务器ip地址就够了,那么他就可以通过put方法无限量的进行服务器上传。
如果开启了put方法,那么就可以任意写写入文件到服务器。但是如果禁用了put方法,那么又有导致一些需要put方法的业务无法使用.
修改tomcat的配置。修改在tomcat的/conf目录下的web.xml。找到下面这段把readonly设置成true。这样就无法通过put往服务器中写入文件了.
|
解决:修改tomcat的web.xml文件设置为允许读写
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<!--允许读写-->
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
|
这篇关于Spring Boot文件上传和下载的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!