文件上傳就是通過io流復(fù)制到瀏覽器的過程
快速實(shí)現(xiàn)文件上傳功能
1.后臺(tái)實(shí)現(xiàn)文件上傳功能? 定義controllere
@RequestMapping("/upload/file")
@ResponseBody
public String uploadImg(@RequestParam("file") MultipartFile multipartFile){
if (multipartFile.isEmpty()){
return "文件有誤";
}
long size = multipartFile.getSize(); //文件大小
String originalFilename = multipartFile.getOriginalFilename(); //文件名字
String contentType = multipartFile.getContentType(); //文件類型
return uploadService.uploadFile(multipartFile);
}
定義serevice
@Value("${file.uploadFolder}")
private String uploadFolder; //具體位置
@Value("${file.staticPath}")
private String staticPath; //http://localhpst:8080
/**
*MultipartFile 這個(gè)對象是springmvc提供的文件上傳的接受的類
* 他的底層自動(dòng)會(huì)和HttpServletRequest request 中的request.getInputStream融合
* 從而達(dá)到文件上傳的效果,也就是告訴我們一個(gè)道理
* 文件上傳的底層原理request.getInputStream
* @param multipartFile
* @return
*/
public String uploadFile(MultipartFile multipartFile){
try {
//文件名字
String filename = multipartFile.getOriginalFilename();
//文件后綴
String suffix = filename.substring(filename.lastIndexOf("."));
// 生成的唯一的文件名:能不能用中文名:不能因?yàn)榻y(tǒng)一用英文命名。
String newFileName = UUID.randomUUID().toString() + suffix;
//日期目錄
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
String format = dateFormat.format(new Date());//2021/11/03
//指定文件上傳的目錄
String targetPath = uploadFolder + format;
File file = new File(targetPath);
// 如果目錄不存在 遞歸創(chuàng)建
if (!file.exists())
file.mkdirs();
//指定文件上傳以后的服務(wù)器的完整的文件名
File targetFileName = new File(targetPath,newFileName);
//文件上傳到指定的目錄
multipartFile.transferTo(targetFileName);
//可訪問的路徑要返回頁面
// http://localhpst:8080/2021/10/27/5f61dea2-4b77-4068-8d0b-fdf415eac6df.png
//文件所在的目錄和文件名(生成的)
String filename1 = format +"/"+ newFileName;
return staticPath+filename1;
} catch (IOException e) {
e.printStackTrace();
return "faile";
}
}
文件上傳不會(huì)直接上傳真是的目錄,它一定要經(jīng)過一個(gè)臨時(shí)目錄的中轉(zhuǎn)以后,才會(huì)上傳到真是目錄。作用:
-
防止上傳出現(xiàn)網(wǎng)絡(luò)斷開,或者用戶上傳直接刷新或者取消。因?yàn)槿绻脩舻木W(wǎng)絡(luò)斷開或者取消,就造成大量的垃圾文件
-
保證真實(shí)目錄上傳的文件一定是有效的。
?配置文件上傳大小
spring:
servlet:
multipart:
# 是單個(gè)文件大小 默認(rèn)1M 10KB
max-file-size: 20MB
# 是設(shè)置總上傳的數(shù)據(jù)大小
max-request-size: 100MB
#當(dāng)文件達(dá)到多少時(shí)進(jìn)行磁盤寫入
file-size-threshold: 20MB
#臨時(shí)目錄
location: D://test
?或者這樣配置
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//文件最大
factory.setMaxFileSize("10240KB"); //KB,MB
/// 設(shè)置總上傳數(shù)據(jù)總大小
factory.setMaxRequestSize("102400KB");
return factory.createMultipartConfig();
}
這樣就達(dá)到了文件上傳的功能
2.通過http請求服務(wù)資源
????????springboot有一個(gè)目錄:static這個(gè)目錄其實(shí)就是靜態(tài)資源目錄,這個(gè)目錄下面的文件是可以通過http直接問題的。但是程序話一般打成jar包,我們沒辦法去文件寫入到這個(gè)static下,還有就是上傳文件要訪問的話,打成jar包也不能直接訪問,所以springboot提供靜態(tài)資源目錄的額外的映射機(jī)制,就是靜態(tài)資源服務(wù)映射。它就類似于:nginx的靜態(tài)資源映射。
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Value("${file.staticPatternPath}")
private String staticPatternPath;
@Value("${file.uploadFolder}")
private String uploadFolder;
// 這個(gè)就是springboot中springMvc讓程序開發(fā)者去配置文件上傳的額外的靜態(tài)資源服務(wù)的配置
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//registry.addResourceHandler("訪問的路徑").addResourceLocations("上傳資源的路徑");
//注意: uploadFolder 后面一定跟/ 如 E:/test/ 如果E:/test 就會(huì)出現(xiàn)404
registry.addResourceHandler(staticPatternPath).addResourceLocations("file:"+uploadFolder);
}
}
配置文件
file:
uploadFolder: E:/test/
staticPath: http://localhost:8080/
staticPatternPath: /uploadFile/**
3.阿里云簡單上傳
官方文檔?前言 (aliyun.com)https://help.aliyun.com/document_detail/32008.html?spm=5176.87240.400427.45.4c884614EG2PmS endpoint,accessKeyId,accessKeySecret,bucketName是oss自帶參數(shù),登陸oss查看
service層
public String oosUploadFile(MultipartFile multipartFile) {
String bucketName = null;
String endpoint = null;
String fileUrl = null;
try {
//Bucket名稱。
bucketName = "xxx";
// yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填 寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云賬號(hào)AccessKey擁有所有API的訪問權(quán)限,風(fēng)險(xiǎn)很高。強(qiáng)烈建議您創(chuàng)建并使用RAM用戶
進(jìn)行API訪問或日常運(yùn)維,請登錄RAM控制臺(tái)創(chuàng)建RAM用戶。
String accessKeyId = "XXX";
String accessKeySecret = "XXXX";
// 創(chuàng)建OSSClient實(shí)例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
InputStream inputStream = multipartFile.getInputStream();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
String format = simpleDateFormat.format(new Date());
String originalFilename = multipartFile.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
String fileName = UUID.randomUUID().toString();
String newName = fileName + suffix;
fileUrl = format + "/" + newName;
// 創(chuàng)建PutObjectRequest對象。
// 依次填寫B(tài)ucket名稱(例如examplebucket)、Object完整路徑(例如exampledir/exampleobject.txt)和本地文件的完整路徑。Object完整路徑中不能包含Bucket名稱。
// 如果未指定本地路徑,則默認(rèn)從示例程序所屬項(xiàng)目對應(yīng)本地路徑中上傳文件。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileUrl, inputStream);
// 如果需要上傳時(shí)設(shè)置存儲(chǔ)類型和訪問權(quán)限,請參考以下示例代碼。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// 上傳文件。
ossClient.putObject(putObjectRequest);
// 關(guān)閉OSSClient。
ossClient.shutdown();
} catch (IOException e) {
e.printStackTrace();
}
//https://upload-liang.oss-cn-beijing.aliyuncs.com/2021/11/04/129904d9-d959-44e1-bcaa-5f7a0b663287.tx
return "https://" + bucketName + "." + endpoint + "/" + fileUrl;
}
4.阿里云簡單下載到瀏覽器
controller層
@RequestMapping("/download")
@ResponseBody
public void download(HttpServletResponse response){
String filePath = "2021/11/04/129904d9-d959-44e1-bcaa-5f7a0b663287.txt";
uploadService.download(response,filePath);
//uploadService.downFile(response);
}
?service層文章來源:http://www.zghlxwxcb.cn/news/detail-406750.html
public void download( HttpServletResponse response,String filePath){
String filename = filePath.substring(filePath.lastIndexOf("/")).replace("/", "");
//String filename = "129904d9-d959-44e1-bcaa-5f7a0b663287.txt";
String endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云賬號(hào)AccessKey擁有所有API的訪問權(quán)限,風(fēng)險(xiǎn)很高。強(qiáng)烈建議您創(chuàng)建并使用RAM用戶進(jìn)行API訪問或日常運(yùn)維,請登錄RAM控制臺(tái)創(chuàng)建RAM用戶。
String accessKeyId = "xxxx";
String accessKeySecret = "xxxx";
// 填寫B(tài)ucket名稱。
String bucketName = "upload-liang";
BufferedInputStream bufferedInputStream = null;
OutputStream outputStream = null;
try {
response.reset();
response.setCharacterEncoding("utf-8");
response.setContentType("application/x-msdownload");
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("UTF-8"), "iso8859-1"));
// 創(chuàng)建OSSClient實(shí)例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//public OSSObject getObject(String bucketName, String key) throws OSSException, ClientException;
// key值為 不包含Bucket名稱在內(nèi)的Object完整路徑,例如2021/11/04/129904d9-d959-44e1-bcaa-5f7a0b663287.txt。
OSSObject object = ossClient.getObject(bucketName, filePath);
bufferedInputStream = new BufferedInputStream(object.getObjectContent());
outputStream = response.getOutputStream();
byte[] bytes = new byte[1024];
int len = 0;
while (((len=bufferedInputStream.read(bytes))!=-1)){
outputStream.write(bytes,0,len);
}
outputStream.flush();
ossClient.shutdown();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (outputStream != null) {
outputStream.close();
}
if (bufferedInputStream != null) {
bufferedInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.阿里云簡單下載到本地文章來源地址http://www.zghlxwxcb.cn/news/detail-406750.html
public void downLoad(){
// yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云賬號(hào)AccessKey擁有所有API的訪問權(quán)限,風(fēng)險(xiǎn)很高。強(qiáng)烈建議您創(chuàng)建并使用RAM用戶進(jìn)行API訪問或日常運(yùn)維,請登錄RAM控制臺(tái)創(chuàng)建RAM用戶。
String accessKeyId = "xxxx";
String accessKeySecret = "xxxx";
// 填寫B(tài)ucket名稱。
String bucketName = "upload-liang";
// 填寫不包含Bucket名稱在內(nèi)的Object完整路徑,例如testfolder/exampleobject.txt。
String objectName = "2021/11/04/129904d9-d959-44e1-bcaa-5f7a0b663287.txt";
// 創(chuàng)建OSSClient實(shí)例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 下載Object到本地文件,并保存到指定的本地路徑中。如果指定的本地文件存在會(huì)覆蓋,不存在則新建。
// 如果未指定本地路徑,則下載后的文件默認(rèn)保存到示例程序所屬項(xiàng)目對應(yīng)本地路徑中。
ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File("D:\\test\\examplefile.txt"));
// 關(guān)閉OSSClient。
ossClient.shutdown();
}
到了這里,關(guān)于文件上傳及oss簡單上傳及下載的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!