文件上传就是通过io流复制到浏览器的过程
快速实现文件上传功能
1.后台实现文件上传功能 定义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 这个对象是springmvc提供的文件上传的接受的类
* 他的底层自动会和HttpServletRequest request 中的request.getInputStream融合
* 从而达到文件上传的效果,也就是告诉我们一个道理
* 文件上传的底层原理request.getInputStream
* @param multipartFile
* @return
*/
public String uploadFile(MultipartFile multipartFile){
try {
//文件名字
String filename = multipartFile.getOriginalFilename();
//文件后缀
String suffix = filename.substring(filename.lastIndexOf("."));
// 生成的唯一的文件名:能不能用中文名:不能因为统一用英文命名。
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);
// 如果目录不存在 递归创建
if (!file.exists())
file.mkdirs();
//指定文件上传以后的服务器的完整的文件名
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";
}
}
文件上传不会直接上传真是的目录,它一定要经过一个临时目录的中转以后,才会上传到真是目录。作用:
-
防止上传出现网络断开,或者用户上传直接刷新或者取消。因为如果用户的网络断开或者取消,就造成大量的垃圾文件
-
保证真实目录上传的文件一定是有效的。
配置文件上传大小
spring:
servlet:
multipart:
# 是单个文件大小 默认1M 10KB
max-file-size: 20MB
# 是设置总上传的数据大小
max-request-size: 100MB
#当文件达到多少时进行磁盘写入
file-size-threshold: 20MB
#临时目录
location: D://test
或者这样配置
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//文件最大
factory.setMaxFileSize("10240KB"); //KB,MB
/// 设置总上传数据总大小
factory.setMaxRequestSize("102400KB");
return factory.createMultipartConfig();
}
这样就达到了文件上传的功能
2.通过http请求服务资源
springboot有一个目录:static这个目录其实就是静态资源目录,这个目录下面的文件是可以通过http直接问题的。但是程序话一般打成jar包,我们没办法去文件写入到这个static下,还有就是上传文件要访问的话,打成jar包也不能直接访问,所以springboot提供静态资源目录的额外的映射机制,就是静态资源服务映射。它就类似于:nginx的静态资源映射。
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Value("${file.staticPatternPath}")
private String staticPatternPath;
@Value("${file.uploadFolder}")
private String uploadFolder;
// 这个就是springboot中springMvc让程序开发者去配置文件上传的额外的静态资源服务的配置
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//registry.addResourceHandler("访问的路径").addResourceLocations("上传资源的路径");
//注意: uploadFolder 后面一定跟/ 如 E:/test/ 如果E:/test 就会出现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自带参数,登陆oss查看
service层
public String oosUploadFile(MultipartFile multipartFile) {
String bucketName = null;
String endpoint = null;
String fileUrl = null;
try {
//Bucket名称。
bucketName = "xxx";
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填 写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户
进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "XXX";
String accessKeySecret = "XXXX";
// 创建OSSClient实例。
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;
// 创建PutObjectRequest对象。
// 依次填写Bucket名称(例如examplebucket)、Object完整路径(例如exampledir/exampleobject.txt)和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileUrl, inputStream);
// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// 上传文件。
ossClient.putObject(putObjectRequest);
// 关闭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层文章来源:https://www.toymoban.com/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";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "xxxx";
String accessKeySecret = "xxxx";
// 填写Bucket名称。
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"));
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//public OSSObject getObject(String bucketName, String key) throws OSSException, ClientException;
// key值为 不包含Bucket名称在内的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.阿里云简单下载到本地文章来源地址https://www.toymoban.com/news/detail-406750.html
public void downLoad(){
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "xxxx";
String accessKeySecret = "xxxx";
// 填写Bucket名称。
String bucketName = "upload-liang";
// 填写不包含Bucket名称在内的Object完整路径,例如testfolder/exampleobject.txt。
String objectName = "2021/11/04/129904d9-d959-44e1-bcaa-5f7a0b663287.txt";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 下载Object到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。
// 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File("D:\\test\\examplefile.txt"));
// 关闭OSSClient。
ossClient.shutdown();
}
到了这里,关于文件上传及oss简单上传及下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!