文件上传阿里云OSS以及本地图片服务器搭建
目录
- 一、阿里云OSS准备工作
- 二、SpringBoot项目阿里云OSS上传配置
- 三、SSM项目阿里云OSS上传配置
- 四、本地文件服务器搭建以及文件上传
一、阿里云OSS准备工作
登录阿里云官网,开通对象存储OSS。阿里云
阿里云OSS的官网:阿里云OSS官网
创建Bucket实例
按照下面的操作创建实例:
获取AccessKey
点击创建AccessKey,出现下面页面,需要进行认证
按照如下方式;安装SDK。
要求jdk在7以上
maven依赖:
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>
如果使用的是Java 9及以上的版本,则需要添加以下JAXB相关依赖。
<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里的内容如下:
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 {@Autowiredprivate 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/SKDefaultCredentialProvider 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内容文件如下:
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当中。
上传接口:
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 {@Autowiredprivate AliyunOSSOperator aliyunOSSOperator;@RequestMapping("/upload")@ResponseBodypublic 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
:
<!-- 配置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配置中加入
<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中的所有配置如下:
<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类需要做如下修改:
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文件,将项目的只读关闭。
<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>
文件上传的接口如下:
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());}
}