1.文件上传

1.介绍

文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。

2.前端的文件上传–form表单

将静态的页面资源放到static资源包下,upload.html文件代码如下

姓名:

年龄:

头像:

enctype="multipart/form-data":必须设置表单编码格式参数为multipart/form-data,因为普通默认的编码格式不适合传输大型数据 。 关于enctype的介绍:

3.服务端接收文件

建立Controller层的代码:

@Slf4j

@RestController

public class UploadController {

@PostMapping("/upload")

public Result upLoad(String username, Integer age, MultipartFile image) {

log.info("文件的上传,参数:{},{},{}", username, age, image);

return Result.success();

}

}

接收时的必要参数:MultipartFile(Java中提供的api接口) ,在接收参数时会产生一个临时文件,等待上传成功时候临时文件会自动的删除。

2.文件的存储

1.本地存储

在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。废话不说直接上代码(同样也是Controller层):

@Slf4j

@RestController

public class UploadController {

@PostMapping("/upload")

public Result upLoad(String username, Integer age, MultipartFile image) throws IOException {

log.info("文件的上传,参数:{},{},{}", username, age, image);

//获取文件原始名

String originalFilename = image.getOriginalFilename();

//构造唯一的文件名 uuid(通用唯一识别码--长度固定的字符串 de49685b-6lc0-4b11-80fa-c7le95924018)

int index = originalFilename.lastIndexOf(".");

String extName = originalFilename.substring(index);//获取后缀文件名

String newFileName= UUID.randomUUID().toString()+extName;

log.info("获取到的文件名:{}",newFileName);

//将文件存入指定的目录

image.transferTo(new File("D:\\resources\\" + newFileName));

return Result.success();

}

}

但是这种方式只能上传的文件大小只有1MB,超出之后就要配置一下application.properties文件:

#配置单个文件最大上传大小

spring.servlet.multipart.max-file-size=10MB

#配置单个请求最大上传大小(一次请求可以上传多个文件,多个文件的总大小不能超过设置值)

spring.servlet.multipart.max-request-size=100MB

2.阿里云介绍

阿里云:阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商。

阿里云OSS

阿里云对象存储OSS (Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

第三方服务的通用思路

准备工作->参照官方SDK编写入门程序->集成使用

SDK:Software Development Kit 的缩写,软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做SDK。

阿里云OSS–使用步骤

准备工作:注册阿里云(实名认证)->充值->开通对象存储服务(0SS)->创建bucket->获取AccessKey(秘钥)

Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。

参考阿里云文档进行快速入门

3.阿里云OSS集层开发–基于阿里云的云上传

步骤:

(1)引入阿里云OSS上传文件工具类(由官方的示例代码改造而来),示例:

package com.mannor.utils;

import com.aliyun.oss.OSS;

import com.aliyun.oss.OSSClientBuilder;

import org.springframework.stereotype.Component;

import org.springframework.web.multipart.MultipartFile;

import java.io.*;

import java.util.UUID;

/**

* 阿里云 OSS 工具类

*/

@Component //交给了IOC容器管理--实现对此工具类进行操作

public class AliOSSUtils {

private String endpoint = "https://oss-cn-chengdu.aliyuncs.com";

private String accessKeyId = "yourAccessKeyId";

private String accessKeySecret = "yourAccessKeySecret";

private String bucketName = "mannor-tlias";

/**

* 实现上传图片到OSS

*/

public String upload(MultipartFile file) throws IOException {

// 获取上传的文件的输入流

InputStream inputStream = file.getInputStream();

// 避免文件覆盖

String originalFilename = file.getOriginalFilename();

String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

//上传文件到 OSS

OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

ossClient.putObject(bucketName, fileName, inputStream);

//文件访问路径

String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;

// 关闭ossClient

ossClient.shutdown();

return url;// 把上传到oss的路径返回

}

}

(2)上传图片接口开发,代码:

package com.mannor.Controller;

import com.mannor.pojo.Result;

import com.mannor.utils.AliOSSUtils;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Slf4j

@RestController

public class UploadController {

@Autowired

private AliOSSUtils aliOSSUtils; //使用bean对象

@PostMapping("/upload")

public Result upLoad(MultipartFile image) throws IOException {

log.info("文件的上传,文件名:{}", image.getOriginalFilename());

String url = aliOSSUtils.upload(image); //返回值为文件的URL

log.info("文件上传完成,文件URl是:{}", url);

return Result.success(url);

}

}

3. 代码优化–把信息写入配置文件

由于之后项目开发会有大量的java文件在项目里面,所以把密码等信息写入application.properties配置文件方便管理

配置文件:

#阿里云OSS配置

aliyun.oss.endpoint=https://oss-cn-chengdu.aliyuncs.com

aliyun.oss.accessKeyId=accessKeyId

aliyun.oss.accessKeySecret=accessKeySecret

aliyun.oss.bucketName=mannor-tlias

工具类AliOSSUtils:通过@Value注解的方式来将application.properties配置文件中的值进行传输

@Component

public class AliOSSUtils {

@Value("${aliyun.oss.endpoint}")

private String endpoint ;

@Value("${aliyun.oss.accessKeyId}")

private String accessKeyId ;

@Value("${aliyun.oss.accessKeySecret}")

private String accessKeySecret ;

@Value("${aliyun.oss.bucketName}")

private String bucketName ;

/**

* 实现上传图片到OSS

*/

public String upload(MultipartFile file) throws IOException {

// 获取上传的文件的输入流

InputStream inputStream = file.getInputStream();0

// 避免文件覆盖

String originalFilename = file.getOriginalFilename();

String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

//上传文件到 OSS

OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

ossClient.putObject(bucketName, fileName, inputStream);

//文件访问路径

String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;

// 关闭ossClient

ossClient.shutdown();

return url;// 把上传到oss的路径返回

}

}

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。