1.单体应用可以将图片存在项目本地
2.分布式项目不能将图片存在项目本地,因为一个服务部署在多个服务器,在一次上传图片上传到了1号服务器,如果下次请求到了2号服务器,将拿不到1号服务器保存的图片
要解决此问题我们可以使用文件存储服务,文件同一写入这个服务中,同时读取时也统一在这里获取:
3. 这里我们使用阿里云的OSS对象存储服务:
(1)进入阿里云的控制台
(2)创建此项目的存储空间(Bucket):gulimail-d
(3)进入刚刚的Bucket,上传图片访问测试
在浏览器访问:https://gulimail-d.oss-cn-beijing.aliyuncs.com/dongman.png就可以得到此图片。
4.如何实现在前端页面直接上传图片到这个Bucket :
(1)用户上传之前先在我们自己的服务拿到防伪签名,拿到后直接请求oss上传图片,这样就不会泄露我们自己的oss账号密码。
5.oss文件上传的java代码实现:(在阿里云找到oss文件上传的java的SDK:)
(1)想要通过java代码实现oss文件上传,首先需要导入阿里云对象存储的jar包
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.5.0</version>
</dependency>
(2)文件流上传代码实现:
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "yourEndpoint";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
InputStream inputStream = new FileInputStream("D:\\localpath\\examplefile.txt");
// 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。
ossClient.putObject("examplebucket", "exampledir/exampleobject.txt", inputStream);
// 关闭OSSClient。
ossClient.shutdown();
(3)创建访问oss的账户密码:点击用户头像,找到AccessKey管理,然后创建子用户,账户类型点击只允许编程API登录访问。