日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

channelsftp 上传文件为空_SpringBoot文件上传下载篇(九)

發布時間:2024/7/23 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 channelsftp 上传文件为空_SpringBoot文件上传下载篇(九) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方藍色字體,關注我們

上傳文件是互聯網中應用的場景之一,最典型的情況就是上傳頭像。文件上傳主要是將文件通過IO流傳輸到服務器的某一個特定的文件夾下。

Why->MultipartFile?

解析源碼:

public?interface?MultipartFile?extends?InputStreamSource?{

}
public?class?MockMultipartFile?extends?Object?implements?MultipartFile?implements?MultipartFile,?Serializable?{

}
public?class?CommonsMultipartFile?implements?MultipartFile,?Serializable?{

}
public?interface?MultipartFile?extends?InputStreamSource?{

}

通過源碼可以看出?MultipartFile是一個接口,這個接口的實現類有?CommonsMultipartFile,MockMultipartFileMultipartFile繼承InputStreamSource這個接口。

MultipartFile
--String?getName()?//返回表單中file文件參數name的名稱。
--String?getOriginalFilename()?//?文件原名稱
--String?getContentType()?//返回文件的內容類型。
--boolean?isEmpty()?// 返回上傳的文件是否為空,即,在多部分表單中沒有選擇任何文件,或者所選文件沒有內容。
--long?getSize()?// 以字節為單位返回文件的大小。
--byte[]?getBytes()?//將文件的內容作為字節數組返回。
--InputStream?getInputStream()?//返回一個InputStream以從中讀取文件的內容。
--void?transferTo(File?dest)?//將收到的文件傳輸到給定的目標文件。

參考官網地址

https://docs.spring.io/spring/docs/current/javadoc-

api/org/springframework/web/multipart/MultipartFile.html

開始搭建

環境jdk1.8,引入了spring-boot-starter-thymeleaf做頁面模板引擎。

?<properties>
????<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>
<dependency>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-devtoolsartifactId>
????<optional>trueoptional>
dependency>
dependencies>

application.properties配置文件

#thymeleaf
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
#?禁用?thymeleaf?緩存
spring.thymeleaf.cache=false

#?上傳文件總的最大值
spring.servlet.multipart.max-request-size=10MB
#?單個文件的最大值
spring.servlet.multipart.max-file-size=10MB
#?是否支持批量上傳???(默認值?true)
spring.servlet.multipart.enabled=true
#?上傳文件的臨時目錄?(一般情況下不用特意修改)
spring.servlet.multipart.location=
#?文件大小閾值,當大于這個閾值時將寫入到磁盤,否則存在內存中,(默認值0?一般情況下不用特意修改)
spring.servlet.multipart.file-size-threshold=0
#?判斷是否要延遲解析文件(相當于懶加載,一般情況下不用特意修改)
spring.servlet.multipart.resolve-lazily=false

常見問題:

1、表單method設置為post,并將enctype設置為multipart/form-data。

2、html中name值要和@RequestParam("file")中的值保持一致。

3、上傳文件大小spring.http.multipart.max-file-size限制,如果上傳的文件超過設置的值會出現這個錯誤。

這個錯誤是因為Spring文件上傳重置問題,這個異常是捕獲不到,需要Tomcat的默認連接器?maxSwallowSize?的參數。

<Connector?port="8080"?protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"maxSwallowSize="-1"?/>

并在上傳前實現Javascript檢查文件大小。

單文件上傳

單文件上傳html頁面

html>
<html?lang="en">
<head>
???<meta?charset="UTF-8">
???<title>單文件上傳title>
head>
?<body>
?<p>單文件上傳p>
<form?method="POST"?enctype="multipart/form-data"?action="/upload"?>
文件:<input?type="file"?name="file"/>
??????<input?type="submit"/>
form>
<hr/>
body>

創建FileUploadController中的upload方法 (單文件上傳)

@PostMapping("/upload")
@ResponseBody
public?String?upload(@RequestParam("file")?MultipartFile?file)?{
????//判斷非空
????if?(file.isEmpty())?{
????????return?"上傳的文件不能為空";
????}
????try?{
????????//?測試MultipartFile接口的各個方法
????????logger.info("[文件類型ContentType]?-?[{}]",file.getContentType());
????????logger.info("[文件組件名稱Name]?-?[{}]",file.getName());
????????logger.info("[文件原名稱OriginalFileName]?-?[{}]",file.getOriginalFilename());
????????logger.info("[文件大小]?-?[{}]",file.getSize());
????????logger.info(this.getClass().getName()+"圖片路徑:"+path);
????????File?f?=?new?File(path);
????????//?如果不存在該路徑就創建
????????if?(!f.exists())?{
????????????f.mkdir();
????????}
????????File?dir?=?new?File(path?+?file.getOriginalFilename());
????????//?文件寫入
????????file.transferTo(dir);
????????return?"上傳單個文件成功";
????}?catch?(Exception?e)?{
????????e.printStackTrace();
????????return?"上傳單個文件失敗";
????}
}

注:這里除了transferTo方法,也可以用字節流的方式上傳文件,但是字節流比較慢,所以還是建議用transferTo,下面這個方法是封裝的一個用字節流寫入文件的方法。

??public?void?writeFile(MultipartFile?file)?{
????try?{
????????//獲取輸出流
????????OutputStream?os?=?new?FileOutputStream(path?+?file.getOriginalFilename());
????????//獲取輸入流?CommonsMultipartFile?中可以直接得到文件的流
????????InputStream?is?=?file.getInputStream();
????????byte[]?buffer?=?new?byte[1024];
????????//判斷輸入流中的數據是否已經讀完的標識
????????int?length?=?0;
????????//循環將輸入流讀入到緩沖區當中,(len=in.read(buffer))>0就表示in里面還有數據
????????while((length?=?is.read(buffer))!=-1){
????????????//使用FileOutputStream輸出流將緩沖區的數據寫入到指定的目錄(savePath?+?"\\"?+?filename)當中
????????????os.write(buffer,?0,?length);
????????}
????????os.flush();
????????os.close();
????????is.close();
????}?catch?(FileNotFoundException?e)?{
????????e.printStackTrace();
????}?catch?(IOException?e)?{
????????e.printStackTrace();
????}
}

操作步驟

單文件上傳完成啦,接下來就是多文件上傳和文件下載。

多文件上傳

html頁面

html>
<html?lang="en">
<head>
<meta?charset="UTF-8">
<title>多文件上傳title>
head>
<body>
<p>多文件上傳p>
<form?method="POST"?enctype="multipart/form-data"?action="/uploadBatch">
????<p>文件1:<input?type="file"?name="file"/>p>
????<p>文件2:<input?type="file"?name="file"/>p>
????<p><input?type="submit"?value="上傳"/>p>
form>
body>
html>

uploadBatch方法

@PostMapping("/uploadBatch")
@ResponseBody
public?String?uploadBatch(@RequestParam("files")?MultipartFile[]?files)?{
????logger.info("文件名稱:"+?files?);
????if(files!=null&&files.length>0){
????????String?filePath?=?"D:\\datafile\\";
????????for?(MultipartFile?mf?:?files)?{
????????????//?獲取文件名稱
????????????String?fileName?=?mf.getOriginalFilename();
????????????//?獲取文件后綴
????????????String?suffixName?=?fileName.substring(fileName.lastIndexOf("."));
????????????//?重新生成文件名
????????????fileName?=?UUID.randomUUID()+suffixName;

????????????if?(mf.isEmpty())?{
????????????????return?"文件名稱:"+?fileName?+"上傳失敗,原因是文件為空!";
????????????}
????????????File?dir?=?new?File(filePath?+?fileName);
????????????try?{
????????????????//?寫入文件
????????????????mf.transferTo(dir);
????????????????logger.info("文件名稱:"+?fileName?+"上傳成功");
????????????}?catch?(IOException?e)?{
????????????????logger.error(e.toString(),?e);
????????????????return?"文件名稱:"+?fileName?+"上傳失敗";
????????????}
????????}
????????return?"多文件上傳成功";
????}
????return?"上傳文件不能為空";
}

操作步驟

常見問題

The?field?file?exceeds?its?maximum?permitted?size?of?1048576?bytes.

這個錯誤是由于springboot默認的文件大小是1MB造成的,當上傳文件超過1MB時就會報錯。解決這個報錯可以在application.properties中設置上傳參數,參數項是默認的,我們設置最大上傳文件大小不超過10MB,再次上傳會成功。

文件下載方法

@GetMapping("/downloadfile")
@ResponseBody
public?String?downloadFile(HttpServletRequest?request,?HttpServletResponse?response)?throws?UnsupportedEncodingException?{
????String?fileName?=?"大話設計模式(帶目錄完整版).pdf";//?文件名

????if?(fileName?!=?null)?{
????????//設置文件路徑
????????File?file?=?new?File("D:\\datafile\\大話設計模式(帶目錄完整版).pdf");
????????//File?file?=?new?File(realPath?,?fileName);
????????if?(file.exists())?{
????????????response.setContentType("multipart/form-data");
????????????response.setHeader("Content-Disposition",?"attachment;?fileName="+??fileName?+";filename*=utf-8''"+?URLEncoder.encode(fileName,"UTF-8"));
????????????byte[]?buffer?=?new?byte[1024];
????????????FileInputStream?fis?=?null;
????????????BufferedInputStream?bis?=?null;
????????????try?{
????????????????fis?=?new?FileInputStream(file);
????????????????bis?=?new?BufferedInputStream(fis);
????????????????OutputStream?os?=?response.getOutputStream();
????????????????int?i?=?bis.read(buffer);
????????????????logger.info(""+i);
????????????????while?(i?!=?-1)?{
????????????????????os.write(buffer,?0,?i);
????????????????????i?=?bis.read(buffer);
????????????????}
????????????????return?"下載成功";
????????????}?catch?(Exception?e)?{
????????????????e.printStackTrace();
????????????}?finally?{
????????????????if?(bis?!=?null)?{
????????????????????try?{
????????????????????????bis.close();
????????????????????}?catch?(IOException?e)?{
????????????????????????e.printStackTrace();
????????????????????}
????????????????}
????????????????if?(fis?!=?null)?{
????????????????????try?{
????????????????????????fis.close();
????????????????????}?catch?(IOException?e)?{
????????????????????????e.printStackTrace();
????????????????????}
????????????????}
????????????}
????????}
????}
????return?"文件不存在";
}

在下載文件時,中文文件名稱會出現亂碼問題,需要設置一下即可。

response.setHeader("Content-Disposition",?"attachment;?fileName="+??fileName?+";filename*=utf-8''"+?URLEncoder.encode(fileName,"UTF-8"));總結

下載的html頁面我就不復制啦,一個Spring Boot 上傳和下載文件的簡單 Demo 就完成了,感興趣的同學可以將示例代碼下載下來試試吧。

GitHub:

https://github.com/xiaonongOne/springboot-upload

總結

以上是生活随笔為你收集整理的channelsftp 上传文件为空_SpringBoot文件上传下载篇(九)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。