上传文件到阿里云OSS服务器(一)
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
1.工具类 AliOSSCloudUtil
package com.dycx.framework.api.ossutils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
public class AliOSSCloudUtil implements Closeable {
Log log = LogFactory.getLog(AliOSSCloudUtil.class);
private OSS ossClient;
public AliOSSCloudUtil() {
ossClient = new OSSClientBuilder().build(OSSConfig.endpoint, OSSConfig.accessKeyId, OSSConfig.accessKeySecret);
}
public void destory() {
ossClient.shutdown();
}
@Deprecated
public String uploadFile2OSS(InputStream instream, String fileName, String filedir, String bucketName) {
String ret = "";
if (!doesBucketExist(bucketName)) {
createBucket(bucketName);
}
try {
String objectName = filedir + fileName;
ossClient.putObject(bucketName, objectName, instream, createObjectMetadata(instream,fileName));
ret = "http://" + bucketName + "." + OSSConfig.endpoint + "/" + objectName;
} catch (IOException e) {
log.error(e.getMessage(), e);
} finally {
try {
if (instream != null) {
instream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return ret;
}
public OssUploadDTO uploadFile2OSSResult(InputStream instream, String fileName, String filedir, String bucketName) {
OssUploadDTO result = new OssUploadDTO();
if (!doesBucketExist(bucketName)) {
createBucket(bucketName);
}
try {
String objectName = filedir + fileName;
ossClient.putObject(bucketName, objectName, instream, createObjectMetadata(instream,fileName));
result.setUrl("http://" + bucketName + "." + OSSConfig.endpoint + "/" + objectName);
result.setBucketName(bucketName);
result.setEndpoint(OSSConfig.endpoint);
result.setObjectName(objectName);
} catch (IOException e) {
log.error(e.getMessage(), e);
} finally {
try {
if (instream != null) {
instream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
public ObjectMetadata createObjectMetadata(InputStream inputStream,String fileName) throws IOException {
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(inputStream.available());
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
objectMetadata.setContentDisposition("inline;filename=" + fileName);
objectMetadata.setHeader("x-oss-forbid-overwrite", "false");
return objectMetadata;
}
public boolean doesObjectExist(String objectName, String bucketName, String filedir) {
return ossClient.doesObjectExist(bucketName, filedir + objectName);
}
public boolean doesBucketExist(String bucketName) {
return ossClient.doesBucketExist(bucketName);
}
public void createBucket(String bucketName) {
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
createBucketRequest.setStorageClass(StorageClass.IA);
boolean exists = ossClient.doesBucketExist(bucketName);
if (!exists) {
try {
ossClient.createBucket(createBucketRequest);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
public static String getcontentType(String FilenameExtension) {
if ("bmp".equalsIgnoreCase(FilenameExtension)) {
return "image/bmp";
}
if ("gif".equalsIgnoreCase(FilenameExtension)) {
return "image/gif";
}
if ("jpeg".equalsIgnoreCase(FilenameExtension) ||
"jpg".equalsIgnoreCase(FilenameExtension) ||
"png".equalsIgnoreCase(FilenameExtension)) {
return "image/jpeg";
}
if ("html".equalsIgnoreCase(FilenameExtension)) {
return "text/html";
}
if ("txt".equalsIgnoreCase(FilenameExtension)) {
return "text/plain";
}
if ("vsd".equalsIgnoreCase(FilenameExtension)) {
return "application/vnd.visio";
}
if ("pptx".equalsIgnoreCase(FilenameExtension) ||
"ppt".equalsIgnoreCase(FilenameExtension)) {
return "application/vnd.ms-powerpoint";
}
if ("docx".equalsIgnoreCase(FilenameExtension) ||
"doc".equalsIgnoreCase(FilenameExtension)) {
return "application/msword";
}
if ("xml".equalsIgnoreCase(FilenameExtension)) {
return "text/xml";
}
return "image/jpeg";
}
public InputStream getInputStreamByFileUrl(String fileName, String bucketName) {
OSSObject ossObject = ossClient.getObject(bucketName, fileName);
return ossObject.getObjectContent();
}
public String generatePresignedUrl(String bucketName, String objectName, long expire) {
Date expiration = new Date(System.currentTimeMillis() + (expire > 0 ? expire : 3600) * 1000);
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
return url.toString();
}
@Override
public void close() {
ossClient.shutdown();
}
}
2.OSSUtil
package com.dytz.risk.utils;
import com.dycx.framework.api.ossutils.AliOSSCloudUtil;
import com.dycx.framework.api.ossutils.OssUploadDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.UUID;
@Slf4j
@Repository
public class OSSUtil {
@Value("${oss.bucket}")
private String bucket;
public OssUploadDTO upload(MultipartFile file) throws Exception {
String dir = "sfc-audio/" + DateUtil.format(LocalDateTime.now(), "yyyy/MM-dd");
String fileName = file.getResource().getFilename();
assert fileName != null;
String name = UUID.randomUUID().toString().replace("-","") + fileName.substring(fileName.lastIndexOf("."));
InputStream inputStream = null;
try {
inputStream = file.getInputStream();
} catch (IOException e) {
e.printStackTrace();
System.out.println("上传失败");
}
AliOSSCloudUtil util = new AliOSSCloudUtil();
OssUploadDTO dto = util.uploadFile2OSSResult(inputStream, name,dir + "/",bucket);
util.close();
String url = util.generatePresignedUrl(dto.getBucketName(),dto.getObjectName(),3000) ;
dto.setUrl(url);
util.close();
return dto;
}
}
3.实现类
@Autowired
private AudioRecordMapper audioRecordMapper;
@Autowired
private OSSUtil ossUtil;
@Override
public int save(MultipartFile file, SaveAudioInfo info)throws Exception{
OssUploadDTO ossUploadDTO=ossUtil.upload(file);
AudioRecord audioRecord=new AudioRecord();
if(ossUploadDTO != null){
BeanUtils.copyProperties(info,audioRecord);
BeanUtils.copyProperties(ossUploadDTO,audioRecord);
audioRecord.setCreateTime(new Date());
}
return audioRecordMapper.insert(audioRecord);
}
4.controller
@Autowired
private IAudioRecordService iAudioRecordService;
@PostMapping("saveAudio")
public RestResponse save(@RequestParam(value = "file",required = true) MultipartFile file,
@RequestParam(required = true) Long userId,
@RequestParam(required = true) Long orderId,
@RequestParam(required = false) Long travelId,
@RequestParam(required = false)Date startTime,
@RequestParam(required = false)Date endTime){
if(!file.isEmpty()){
int result = 0;
try {
SaveAudioInfo audioInfo = new SaveAudioInfo();
audioInfo.setUserId(userId);
audioInfo.setOrderId(orderId);
audioInfo.setTravelId(travelId);
audioInfo.setStartTime(startTime);
audioInfo.setEndTime(endTime);
result = iAudioRecordService.save(file,audioInfo);
} catch (Exception e) {
e.printStackTrace();
log.info("{}",e);
return RestResponse.fail(e.getMessage());
}
if (result > 0) {
return RestResponse.success();
}
return RestResponse.fail("保存失败");
}
return RestResponse.fail("录音文件不存在");
}
5.OssUploadDTO
@Data
public class OssUploadDTO implements Serializable {
private String url;
private String bucketName;
private String endpoint;
private String objectName;
}