最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC文件上傳及查看的示例代碼

 更新時間:2018年01月11日 10:25:13   作者:fanyank  
本篇文章主要介紹了SpringMVC文件上傳及查看的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

寫在前面

談到文件上傳,首先要說業(yè)務邏輯,如果上傳的文件大家都可以看(比如廣告或者首頁的banner)等,那么我們就把圖片放在靜態(tài)資源區(qū)(與css,js一樣的位置)中,如果文件是受保護的(像用戶只能查看自己上傳的照片),那么我們就把它存放在服務器中的某個專門存放圖片的位置。

本例分別展示了存放在兩個位置的上傳文件的方法,上傳之后,作為延伸,還添加了查看上傳的文件以及下載已經(jīng)上傳的文件的功能。

準備工作

配置SpringMVC,導入commons包

在mvc-servlet.xml中配置文件上傳解析器

<!--文件上傳解析器-->
 <bean id="multipartResolver"
  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="maxUploadSize" value="1000000"/>
  <property name="defaultEncoding" value="UTF-8" />
 </bean>

存放在靜態(tài)資源區(qū)

1、存放位置:

存放在項目中,所以路徑為相對項目的路徑。

/{yourproject}/webapp/static/img

2、配置響應的handler

@Controller
public class UploadController {
 @GetMapping("/upload")
 public String UploadHandler() {
 return "upload";
 }

 @PostMapping("/upload/static")
 public void wriToStatic(HttpServletRequest request,
       RedirectAttributes redirectAttributes,
       @RequestParam("fileName") MultipartFile file) {
 if(!file.isEmpty()) {
  //獲取目標文件夾
  String path = request.getServletContext().getRealPath("/") + "static/img/";
  //獲取用戶上傳的源文件名
  String fileName = file.getOriginalFileName();
  //新建文件
  File file1 = new File(path, fileName);
  //將文件寫入
  file.transferTo(file1);

  redirectAttributes.addFlashAttribute("message","upload to static success");
  return "redirect:/upload";
 } else {
  redirectAttributes.addFlashAttribute("message","upload file can not be empty");
  return "redirect:/upload";
 }

 }
}

存放在服務器

1、本例存放位置:

存放在服務器某個位置,與項目無關,所以地址為絕對路徑。

/Users/mac/Desktop/imgtemp/, 為目錄的絕對路徑。

2、配置響應的handler

...
@PostMapping("/upload/disk")
public String writeToDisk(HttpServletRequest request,
       @RequestParam("fileName") MultipartFile file,
       RedirectAttributes redirectAttributes) {
 if(!file.isEmpty()) {
 //獲取源文件名
 String fileName = file.getOriginalFileName();
 //獲取保存文件文件夾路徑
 String path = "/Users/mac/Desktop/imgtemp/";
 //新建文件
 File file1 = new File(path,fileName);
 //寫入文件
 file.transferTo(file1);
 }

}
...

延伸部分(文件的查看及下載)

由于響應是要以流的形式傳遞文件,我們需要正確的設置響應的MIMIE類型才能被瀏覽器正確的解析,應用程序文件的默認MIMIE類型為 application/octet-stream,MIME設置為該值后,瀏覽器不會自動執(zhí)行或詢問執(zhí)行這類文件,會以對待附件的形式直接將文件下載至本地。

更多關于MIMIE的解讀請查看這篇文章

如果我們?nèi)绻胱远x下載文件的名字,那么就需要設置Content-Disposition消息。
Content-Disposition 消息頭指示回復的內(nèi)容該以何種形式展示,是以內(nèi)聯(lián)的形式(即網(wǎng)頁或者頁面的一部分),還是以附件的形式下載并保存到本地。

更過關于Content-Disposition的解讀請查看這篇文章

...
@GetMapping("/download/byDefault")
public void getImgByDefault(@RequestParam String fileName,
       @RequestParam(required=false,defaultValue="") String saveName),
       HttpServletResponse response {
 if(StringUtils.isEmpty(fileName)) {
  response.sendError(404);
  return;
 }
 //文件存放的路徑
 String path = "/Users/mac/Desktop/imgtemp/";
 //新建文件
 File file = new File(path,fileName);

 if(!file.exists()) {
  response.sendError(404);
  return;
 }
 //如果請求參數(shù)saveName不為空,進行文件的下載
 if(!StringUtils.isEmpty(saveName)) {
  //設置響應長度
  response.setContentLength((int)file.length());
  //設置響應的MIME類型為application/octet-stream
  response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);

  saveName = new String(saveName.getBytes("UTF-8"),"ISO8859-1");
  //設置content-disposition為attachment;fileName=saveName
  response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+saveName+"\"");
 }
 //讀取文件
 InputStream is = new FileInputStream(file);
 OutputStream os = response.getOutputStream();
 //將文件以流的形式輸出
 IOUtils.copy(is,os);
 os.flush();
 os.close();
 is.close();

}

我們還可以使用SpringMVC自帶的 ByteArrayHttpMessageConverter 轉(zhuǎn)化器來將文件輸出,該轉(zhuǎn)換器實現(xiàn) HttpMessageConverter 接口。可讀取所有MIME的請求信息,響應信息的MIME為 application/octet-stream

...
@GetMapping("/download/byConvert")
public HttpEntity<byte[]> getImgByConvert(@RequestParam String fileName,
           @RequestParam(required=false,defaultValue="") String saveName) {
 if(StringUtils.isEmpty(fileName)) {
  return new ResponseEntity<>(HttpStatus.NOT_FOUND);
 }

 String path = "/Users/mac/Desktop/imgtemp/";
 File file = new File(path,fileName);

 if(!file.exists()) {
  return new ResponseEntity<>(HttpStatus.NOT_FOUND);
 }

 HttpHeaders headers = new HttpHeaders();
 if(!StringUtils.isEmpty(saveName)) {
  headers.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
  headers.setContentLength(file.length());

  saveName = new Sting(saveName.getBytes("UTF-8"),"ISO8859-1");
  headers.add(HttpHeaders.CONTENT_DISPOSITION,"attachment;fileName=\"" + saveName + "\"");
 } else {
  headers.setContentType(MediaType.IMAGE_PNG);
 }

 return new HttpEntity<>(FileCopyUtils.copyToByteArray(file),headers);

}

upload.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!doctype html>
<html>
<head>
 <meta charset="UTF-8">
 <meta name="viewport"
   content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
 <link rel="stylesheet" href="/static/bootstrap-3.3.5-dist/css/bootstrap.css" rel="external nofollow" >
</head>
<body>
<div class="container">
 <h1 class="text-center">上傳文件撒</h1>
 <c:if test="${not empty message}">
  <h2>${message}</h2>
 </c:if>


 <form:form enctype="multipart/form-data" action="/upload/static">
  <p class="text-info">上傳至/web/static</p>
  <label for="">上傳文件:</label>
  <input type="file" name="uploadFile">

  <button class="btn btn-default">提交</button>
 </form:form>



 <form:form enctype="multipart/form-data" action="/upload/disk">
  <p class="text-info">上傳至Disk</p>
  <label for="">上傳文件</label>
  <input type="file" name="uploadFile">

  <button class="btn btn-default">提交</button>
 </form:form>

 <div class="container">
  <button class="btn btn-default">
   <a href="/download/byDefault?fileName=dubbo.png" rel="external nofollow" target="_blank">使用默認方式查看上傳至Disk的dubbo圖片</a>
  </button>
  <button class="btn btn-default">
   <a href="/download/byDefault?fileName=dubbo.png&saveName=dubb.png" rel="external nofollow" >使用默認方式下載dubbo圖片</a>
  </button>
 </div>

 <div class="container">
  <button class="btn btn-default">
   <a href="/download/byConvert?fileName=dubbo.png" rel="external nofollow" target="_blank">使用MVC轉(zhuǎn)化器查看上傳至Disk的dubbo圖片</a>
  </button>
  <button class="btn btn-default">
   <a href="/download/byConvert?fileName=dubbo.png&saveName=dub.png" rel="external nofollow" >使用MVC轉(zhuǎn)化器下載上傳至Disk的dubbo圖片</a>
  </button>

 </div>
</div>
</body>
</html>

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • java 使用線程做的一個簡單的ATM存取款實例代碼

    java 使用線程做的一個簡單的ATM存取款實例代碼

    線程 Thread 類,和 Runable 接口 比較兩者的特點和應用領域.可以,直接繼承線程Thread類。該方法編寫簡單,可以直接操作線程,適用于單重繼承情況,因而不能在繼承其他類,下面我們來看一個實例
    2013-08-08
  • Guava自動加載緩存LoadingCache使用實戰(zhàn)詳解

    Guava自動加載緩存LoadingCache使用實戰(zhàn)詳解

    這篇文章主要為大家介紹了Guava自動加載緩存LoadingCache使用實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • springboot+vue項目從第一行代碼到上線部署全流程

    springboot+vue項目從第一行代碼到上線部署全流程

    本文詳細介紹了如何從零開始搭建一個基于Spring Boot和Vue.js的前后端分離項目,并涵蓋項目需求分析、技術選型、項目結(jié)構(gòu)設計、前后端交互、部署上線等全過程,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Java ==,equals()與hashcode()的使用

    Java ==,equals()與hashcode()的使用

    本文主要介紹了Java ==,equals()與hashcode()的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • IDEA 如何控制編輯左側(cè)的功能圖標ICON(操作步驟)

    IDEA 如何控制編輯左側(cè)的功能圖標ICON(操作步驟)

    很多朋友被idea左側(cè)的圖標不見了這一問題搞的焦頭爛額,不知道該怎么操作,今天小編就交大家如何控制編輯左側(cè)的功能圖標 ICON,文字內(nèi)容不多,主要通過兩張截圖給大家說明,感興趣的朋友一起看看吧
    2021-05-05
  • SpringBoot 鉤子接口的實現(xiàn)代碼

    SpringBoot 鉤子接口的實現(xiàn)代碼

    本文主要介紹了SpringBoot 鉤子接口,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • Java中注解@Async實現(xiàn)異步及導致失效原因分析

    Java中注解@Async實現(xiàn)異步及導致失效原因分析

    Async注解用于聲明一個方法是異步的,當在方法上加上這個注解時將會在一個新的線程中執(zhí)行該方法,而不會阻塞原始線程,這篇文章主要給大家介紹了關于Java中注解@Async實現(xiàn)異步及導致失效原因分析的相關資料,需要的朋友可以參考下
    2024-07-07
  • 利用Jackson實現(xiàn)數(shù)據(jù)脫敏的示例詳解

    利用Jackson實現(xiàn)數(shù)據(jù)脫敏的示例詳解

    在我們的企業(yè)項目中,為了保護用戶隱私,數(shù)據(jù)脫敏成了必不可少的操作,那么我們怎么優(yōu)雅的利用Jackson實現(xiàn)數(shù)據(jù)脫敏呢,本文就來和大家詳細聊聊,希望對大家有所幫助
    2023-05-05
  • SpringBoot使用JavaMailSender實現(xiàn)發(fā)送郵件

    SpringBoot使用JavaMailSender實現(xiàn)發(fā)送郵件

    JavaMailSender是Spring Framework中的一個接口,用于發(fā)送電子郵件,本文主要為大家詳細介紹了SpringBoot如何使用JavaMailSender實現(xiàn)發(fā)送郵件,需要的可以參考下
    2023-12-12
  • Java使用Condition控制線程通信的方法實例詳解

    Java使用Condition控制線程通信的方法實例詳解

    這篇文章主要介紹了Java使用Condition控制線程通信的方法,結(jié)合實例形式分析了使用Condition類同步檢測控制線程通信的相關操作技巧,需要的朋友可以參考下
    2019-09-09

最新評論

博罗县| 太仆寺旗| 仙游县| 湟源县| 虞城县| 疏勒县| 漳浦县| 铁力市| 资兴市| 香港| 康乐县| 铅山县| 马鞍山市| 韩城市| 遂川县| 临夏县| 安宁市| 财经| 上蔡县| 休宁县| 乐清市| 大名县| 银川市| 庆云县| 英超| 民勤县| 桑日县| 宁河县| 苍山县| 兴安盟| 杭锦旗| 江山市| 绩溪县| 麟游县| 丹棱县| 布拖县| 瑞昌市| 牡丹江市| 鱼台县| 家居| 镇安县|