SpringBoot --web 应用开发之文件上传

旧巷老猫 提交于 2020-04-25 13:53:18

<div class="entry">

	<div class="copyright-area">原文出处: <a ref="nofollow" target="_blank" href="https://blog.lqdev.cn/2018/08/07/springboot/chapter-seventeen/">oKong</a></div>

<h2 id="前言">前言</h2> <blockquote><p>上一章节,我们讲解了利用<code>模版引擎</code>实现前端页面渲染,从而实现动态网页的功能,同时也提出了兼容<code>jsp</code>项目的解决方案。既然开始讲解web开发了,我们就接着继续往<code>web</code>这个方向继续吧。通常,我们在做<code>web</code>开发时,碰见诸如附件上传、图片头像上传等文件的上传需求也是再正常不过的。那么,我们今天我们就来讲讲<code>SpringBoot</code>下<code>文件上传</code>的功能的实现。</p></blockquote> <h2 id="一点知识">一点知识</h2> <p>我们知道,前端上传文件时,最常见的就是利用<code>Form</code>表单的方式进行文件的上传功能了,上传时设置<code>enctype</code>为<code>multipart/form-data</code>,或者直接利用<code>jquery</code>的一些上传插件实现。而后端,在<code>jsp+Servlet</code>时代,最常见的就是利用<code>smartupload</code>上传组件。而在<code>SpringMvc</code>时代,其提供了<code>MultipartFile</code>封装类,它包含了文件的二进制流和文件相关属性(文件名、大小等)。所以在<code>SpringBoot</code>中也是使用此封装类进行文件上传的。</p> <h2 id="文件上传">文件上传</h2> <blockquote><p>上面说到,<code>springmvc</code>中是利用<code>MultipartFile</code>进行文件上传的。而<code>MultipartFile</code>是个接口类,它的实现类有<code>CommonsMultipartFile</code>和<code>StandardMultipartFile</code>。这里简单说明下:</p></blockquote> <hr> <p><strong>StandardMultipartFile</strong>:是基于<code>j2ee</code>自带的文件上传进行解析,即使用<code>Servlet3.0</code>提供的<code>javax.servlet.http.Part</code>上传方式。</p> <p><strong>CommonsMultipartFile</strong>:是基于<code>apache fileupload</code>的解析。</p> <hr> <p><strong>所以正常我们使用时,也是无需关系底层是以哪种方式进行文件上传处理的,<code>SpringMvc</code>会给我们做相应的转换的。</strong></p> <p>这里演示下两种方式。</p> <h3 id="基于J2EE自带方式">基于J2EE自带方式</h3> <blockquote><p>这种方式下,其实无需任何配置。只需按正常的web开发项目集成即可。</p></blockquote> <p>0.pom依赖</p> <div><div id="highlighter_488137" class="syntaxhighlighter notranslate java"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="java plain">&lt;dependency&gt;</code></div><div class="line number2 index1 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;</code></div><div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">&lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;</code></div><div class="line number4 index3 alt1"><code class="java plain">&lt;/dependency&gt;</code></div></div></td></tr></tbody></table></div></div> <p>1.配置文件(可选),正常只需要设置上传的文件大小</p> <div><div id="highlighter_890416" class="syntaxhighlighter notranslate java"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="java plain"># 最大支持文件大小 即单个文件大小</code></div><div class="line number2 index1 alt1"><code class="java plain">spring.http.multipart.max-file-size=1Mb</code></div><div class="line number3 index2 alt2"><code class="java plain"># 最大支持请求大小 即一次性上传的总文件大小</code></div><div class="line number4 index3 alt1"><code class="java plain">spring.http.multipart.max-request-size=10Mb</code></div></div></td></tr></tbody></table></div></div> <p>其他的配置,可直接参考官网的配置信息:<a title="https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#common-application-properties" href="https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#common-application-properties" rel="noopener nofollow" target="_blank" class="external">https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#common-application-properties</a><br> <a title="其他配置" href="http://qiniu.xds123.cn/18-8-7/24631452.jpg" rel="lightbox[29795] nofollow" class="external cboxElement" target="_blank"><img src="http://qiniu.xds123.cn/18-8-7/24631452.jpg" alt="其他配置"></a></p> <p>2.编写控制类</p> <p>FileUploadController.java:</p> <div><div id="highlighter_60511" class="syntaxhighlighter notranslate java "><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div><div class="line number16 index15 alt1">16</div><div class="line number17 index16 alt2">17</div><div class="line number18 index17 alt1">18</div><div class="line number19 index18 alt2">19</div><div class="line number20 index19 alt1">20</div><div class="line number21 index20 alt2">21</div><div class="line number22 index21 alt1">22</div><div class="line number23 index22 alt2">23</div><div class="line number24 index23 alt1">24</div><div class="line number25 index24 alt2">25</div><div class="line number26 index25 alt1">26</div><div class="line number27 index26 alt2">27</div><div class="line number28 index27 alt1">28</div><div class="line number29 index28 alt2">29</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="java color1">@RestController</code></div><div class="line number2 index1 alt1"><code class="java color1">@Slf4j</code></div><div class="line number3 index2 alt2"><code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">FileUploadController {</code></div><div class="line number4 index3 alt1">&nbsp;</div><div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java color1">@PostMapping</code><code class="java plain">(</code><code class="java string">"/upload"</code><code class="java plain">)</code></div><div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">public</code> <code class="java plain">String upload(</code><code class="java color1">@RequestParam</code> <code class="java plain">MultipartFile file) </code><code class="java keyword">throws</code> <code class="java plain">IllegalStateException, IOException {</code></div><div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 判断是否为空文件</code></div><div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code> <code class="java plain">(file.isEmpty()) {</code></div><div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">return</code> <code class="java string">"上传文件不能为空"</code><code class="java plain">;</code></div><div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div><div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 文件类型</code></div><div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">String contentType = file.getContentType();</code></div><div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// springmvc处理后的文件名</code></div><div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">String fileName = file.getName();</code></div><div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">log.info(</code><code class="java string">"服务器文件名:"</code> <code class="java plain">+ fileName);</code></div><div class="line number16 index15 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 原文件名即上传的文件名</code></div><div class="line number17 index16 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">String origFileName = file.getOriginalFilename();</code></div><div class="line number18 index17 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 文件大小</code></div><div class="line number19 index18 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Long fileSize = file.getSize();</code></div><div class="line number20 index19 alt1">&nbsp;</div><div class="line number21 index20 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 保存文件</code></div><div class="line number22 index21 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 可以使用二进制流直接保存</code></div><div class="line number23 index22 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 这里直接使用transferTo</code></div><div class="line number24 index23 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">file.transferTo(</code><code class="java keyword">new</code> <code class="java plain">File(</code><code class="java string">"d://okong-"</code> <code class="java plain">+ origFileName));</code></div><div class="line number25 index24 alt2">&nbsp;</div><div class="line number26 index25 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">return</code> <code class="java plain">String.format(file.getClass().getName() + </code><code class="java string">"方式文件上传成功!\n文件名:%s,文件类型:%s,文件大小:%s"</code><code class="java plain">, origFileName, contentType,fileSize);</code></div><div class="line number27 index26 alt2">&nbsp;</div><div class="line number28 index27 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div><div class="line number29 index28 alt2"><code class="java plain">}</code></div></div></td></tr></tbody></table></div></div> <p>3.启动应用,然后使用<code>postman</code>进行api调用即可,当然大家也可以利用上节课学习的模版引擎技术,编写一个文件上传的表单。</p> <p><a title="J2EE方式" href="http://qiniu.xds123.cn/18-8-7/29984521.jpg" rel="lightbox[29795] nofollow" class="external cboxElement" target="_blank"><img src="http://qiniu.xds123.cn/18-8-7/29984521.jpg" alt="J2EE方式"></a></p> <h3 id="基于FileUpload包方式">基于FileUpload包方式</h3> <blockquote><p>原来在<code>Springmvc</code>时,我们通常都是使用<code>CommonsMultipartResolver</code>进行文件上传处理类配置的,比如最大上传文件大小的。而基于在<code>SpringBoot</code>下,略微有些不同。</p></blockquote> <p>0.pom加入<code>fileUpload</code>依赖</p> <div><div id="highlighter_318760" class="syntaxhighlighter notranslate java"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="java plain">&lt;dependency&gt;</code></div><div class="line number2 index1 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">&lt;groupId&gt;commons-fileupload&lt;/groupId&gt;</code></div><div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">&lt;artifactId&gt;commons-fileupload&lt;/artifactId&gt;</code></div><div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">&lt;version&gt;</code><code class="java value">1.3</code><code class="java plain">.</code><code class="java value">3</code><code class="java plain">&lt;/version&gt;</code></div><div class="line number5 index4 alt2"><code class="java plain">&lt;/dependency&gt;</code></div></div></td></tr></tbody></table></div></div> <p>1.编写一个配置类<br> <code>FileUploadConfig.java</code></p> <div><div id="highlighter_821555" class="syntaxhighlighter notranslate java"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="java color1">@Configuration</code></div><div class="line number2 index1 alt1"><code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">FileUploadConfig {</code></div><div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java color1">@Bean</code></div><div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">public</code> <code class="java plain">MultipartResolver custom() {</code></div><div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">return</code> <code class="java keyword">new</code> <code class="java plain">CommonsMultipartResolver();</code></div><div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div><div class="line number8 index7 alt1"><code class="java plain">}</code></div></div></td></tr></tbody></table></div></div> <p><span style="font-weight: normal;">2.由于</span><code style="font-style: inherit;">spring.http.multipart.enabled</code><span style="font-weight: normal;">默认是</span><code style="font-style: inherit;">true</code><span style="font-weight: normal;">,所以加载类</span><code style="font-style: inherit;">MultipartAutoConfiguration</code><span style="font-weight: normal;">会自动加载,这样fileUpload就会异常了。</span><strong>所以正常有两种方式:在启动类下将此配置类不进行自动加载</strong></p> <div><div id="highlighter_367859" class="syntaxhighlighter notranslate java"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="java color1">@EnableAutoConfiguration</code><code class="java plain">(exclude = {MultipartAutoConfiguration.</code><code class="java keyword">class</code><code class="java plain">})</code></div></div></td></tr></tbody></table></div></div> <p><strong>另一种就是,直接设置<code>spring.http.multipart.enabled</code>为<code>false</code>。<br> 本示例为了两种可切换,使用的是第二种。</strong></p> <p>3.编写控制层:这个和<code>J2EE</code>的方式是一样的,这里就不贴了。<br> 4.启动应用,使用postman访问下:</p> <p><a title="fileupload" href="http://qiniu.xds123.cn/18-8-7/23607459.jpg" rel="lightbox[29795] nofollow" class="external cboxElement" target="_blank"><img src="http://qiniu.xds123.cn/18-8-7/23607459.jpg" alt="fileupload"></a></p> <h2 id="相关资料">相关资料</h2> <ol> <li><a title="https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/" href="https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/" rel="noopener nofollow" target="_blank" class="external">https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/</a></li> </ol> <h2 id="总结">总结</h2> <blockquote><p>本章节主要是讲解了两种方式来进行文件的上传功能。这里就简单的介绍了两种方式的相关配置和一些注意点,像文件大小过大时进行异常捕获,大家可以使用全局异常类来进行捕获,只需捕获<code>MultipartException</code>异常即可,这里就示例了,相对来说比较简单了。</p></blockquote> <h2 id="最后">最后</h2> <blockquote><p>目前互联网上很多大佬都有<code>SpringBoot</code>系列教程,如有雷同,请多多包涵了。本文是作者在电脑前一字一句敲的,每一步都是实践的。若文中有所错误之处,还望提出,谢谢。</p></blockquote>

    <!-- BEGIN #author-bio -->

<!-- END #author-bio -->

</div>

原文地址:http://www.importnew.com/29795.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!