目录
一、阿里云OSS准备工作
登录阿里云官网,开通对象存储OSS。阿里云
阿里云OSS的官网:阿里云OSS官网
创建Bucket实例
按照下面的操作创建实例:
获取AccessKey
点击创建AccessKey,出现下面页面,需要进行认证
按照如下方式;安装SDK。
要求jdk在7以上
maven依赖:
xml
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
如果使用的是Java 9及以上的版本,则需要添加以下JAXB相关依赖。
xml
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
二、SpringBoot项目阿里云OSS上传配置
在创建的SpringBoot当中进行阿里云OSS的配置,之后导入接口就可以使用。
导入两个工具类:
AliyunOSSOperator里的内容如下:
java
package com.qcby.util;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
@Component
public class AliyunOSSOperator {
@Autowired
private AliyunOSSProperties aliyunOSSProperties;
public String upload(byte[] content, String originalFilename) {
String endpoint = aliyunOSSProperties.getEndpoint();
String bucketName = aliyunOSSProperties.getBucketName();
String region = aliyunOSSProperties.getRegion();
String accessKeyId = aliyunOSSProperties.getAccessKeyId();
String accessKeySecret = aliyunOSSProperties.getAccessKeySecret();
// 生成存储路径:yyyy/MM/uuid.扩展名
String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM"));
String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
String objectName = dir + "/" + newFileName;
// 使用 DefaultCredentialProvider 直接传入 AK/SK
DefaultCredentialProvider credentialProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
// 配置 OSS Client(可选,如启用 V4 签名)
ClientBuilderConfiguration clientConfig = new ClientBuilderConfiguration();
clientConfig.setSignatureVersion(SignVersion.V4);
// 创建 OSSClient 实例
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialProvider) // 使用 AK/SK 凭证
.clientConfiguration(clientConfig)
.region(region)
.build();
try {
// 上传文件
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content));
// 返回文件的访问 URL(如:https://bucket.endpoint/objectName)
return endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + objectName;
} finally {
ossClient.shutdown(); // 关闭 OSSClient
}
}
}
AliyunOSSProperties内容文件如下:
java
package com.qcby.util;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliyunOSSProperties {
private String endpoint;
private String bucketName;
private String region;
private String accessKeyId;
private String accessKeySecret;
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public String getAccessKeyId() {
return accessKeyId;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public String getAccessKeySecret() {
return accessKeySecret;
}
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
}
通过这两个类就可以将图片文件等上传到阿里云OSS当中。
上传接口:
java
package com.qcby.controller;
import com.qcby.entity.Result;
import com.qcby.util.AliyunOSSOperator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
//上传接口
@Controller
public class UploadController {
@Autowired
private AliyunOSSOperator aliyunOSSOperator;
@RequestMapping("/upload")
@ResponseBody
public Result uploadFile(MultipartFile file) throws Exception {
String originalFilename = file.getOriginalFilename();
byte[] bytes = file.getBytes();
String url = aliyunOSSOperator.upload(bytes,originalFilename);
return new Result().success(url);
}
}
三、SSM项目阿里云OSS上传配置
在SSM项目中需要在SpringMvc.xml加入一些配置,配置如下,加入org.springframework.web.multipart.commons.CommonsMultipartResolve
:
xml
<!-- 配置MultipartResolver用于文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件最大大小,10MB -->
<property name="maxUploadSize" value="10485760"/>
<!-- 上传文件单个最大大小,10MB -->
<property name="maxUploadSizePerFile" value="10485760"/>
<!-- 内存中最大尺寸,2MB -->
<property name="maxInMemorySize" value="2097152"/>
<!-- 默认编码 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 解析请求的延迟时间 -->
<property name="resolveLazily" value="true"/>
</bean>
同时需要在web.xml当中的dispatcher配置中加入
xml
<multipart-config>
<max-file-size>10485760</max-file-size> <!-- 10MB -->
<max-request-size>10485760</max-request-size> <!-- 10MB -->
<file-size-threshold>2097152</file-size-threshold> <!-- 2MB -->
</multipart-config>
则dispatcher中的所有配置如下:
xml
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!-- 添加multipart配置 -->
<multipart-config>
<max-file-size>10485760</max-file-size> <!-- 10MB -->
<max-request-size>10485760</max-request-size> <!-- 10MB -->
<file-size-threshold>2097152</file-size-threshold> <!-- 2MB -->
</multipart-config>
</servlet>
同时AliyunOSSProperties类需要做如下修改:
java
package com.qcby.util;
import org.springframework.stereotype.Component;
@Component
public class AliyunOSSProperties {
private String endpoint="https://oss-cn-beijing.aliyuncs.com";
private String bucketName="lyf-java-ai";
private String region="cn-beijing";
private String accessKeyId="LTAI5tJJea7CiJc8Y9EKWyMB";
private String accessKeySecret="GkqCMu69g77NzWoTcD1S5UB2yFAEvV";
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public String getAccessKeyId() {
return accessKeyId;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public String getAccessKeySecret() {
return accessKeySecret;
}
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
}
四、本地文件服务器搭建以及文件上传
本地文件服务器需要利用到Tomcat,需要将Tomcat设置为可以上传的模式。
修改conf里面的web.xml文件,将项目的只读关闭。
xml
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
文件上传的接口如下:
java
package com.example.controller;
import com.alibaba.fastjson.JSONObject;
import com.example.util.PropReader;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
@Controller
@RequestMapping("/upload")
public class UploadController {
@RequestMapping("/uploadFile")
public void uploadFile(HttpServletRequest request, HttpServletResponse response, String lastImage, @RequestParam(value = "fileType") String type) throws IOException {
System.out.println(type+"类型是 dasdasd");
//把Request做强制转换
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = mr.getFileMap();
Set<String> keySet = fileMap.keySet();
Iterator<String> iterator = keySet.iterator();
String key = iterator.next();
//获得到上传的文件
MultipartFile multipartFile = fileMap.get(key);
byte[] bytes = multipartFile.getBytes();
//获得文件的原始文件名
String originalFilename = multipartFile.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
String fileName = UUID.randomUUID().toString();
fileName = fileName + suffix;
//创建jersy的客户端
Client client = Client.create();
//删除老图片
if(StringUtils.isNotBlank(lastImage)){
WebResource resource1 = client.resource(lastImage);
resource1.delete();
}
//resource的参数文件服务器上的文件的绝对路径
WebResource resource = client.resource(PropReader.read("filePath")+"/"+type+"/"+fileName);
resource.put(bytes);
JSONObject jo = new JSONObject();
String realPath = PropReader.read("filePath")+"/"+type+"/"+fileName;
String relativePath = "/"+type+"/"+fileName;
jo.put("realPath", realPath);
jo.put("relativePath", relativePath);
System.out.println("真实的路径"+realPath);
System.out.println("相对的路径"+relativePath);
response.getWriter().write(jo.toString());
}
@RequestMapping("/uploadFileMp3")
public void uploadFileMp3(HttpServletRequest request, HttpServletResponse response, String lastMp3, String fileType) throws IOException {
System.out.println(lastMp3);
//把Request做强制转换
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = mr.getFileMap();
Set<String> keySet = fileMap.keySet();
Iterator<String> iterator = keySet.iterator();
String key = iterator.next();
//获得到上传的文件
MultipartFile multipartFile = fileMap.get(key);
byte[] bytes = multipartFile.getBytes();
//获得文件的原始文件名
String originalFilename = multipartFile.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
String fileName = UUID.randomUUID().toString();
fileName = fileName + suffix;
//创建jersy的客户端
Client client = Client.create();
//删除老音频
if(StringUtils.isNotBlank(lastMp3)){
System.out.println(lastMp3);
WebResource resource1 = client.resource(lastMp3);
resource1.delete();
}
//resource的参数文件服务器上的文件的绝对路径
WebResource resource = client.resource(PropReader.read("filePath")+"/"+fileType+"/"+fileName);
resource.put(bytes);
JSONObject jo = new JSONObject();
jo.put("realPath", PropReader.read("filePath")+"/"+fileType+"/"+fileName);
jo.put("relativePath", "/"+fileType+"/"+fileName);
response.getWriter().write(jo.toString());
}
}