Appearance
阿里云 OSS
2025-06-11
java
/**
* 文件管理Service业务层处理
*
* @author admin
* @date 2021-08-05
*/
@Service
@Slf4j
public class ZhsqWjglService {
private static final String BUCKET = OssUtil.getBUCKET();
private static final String FOLDER = "file"; //bucket下的文件夹名称
private static final String PREFIX = OssUtil.getPREFIX();
private static final String ACCESS_KEY_ID = "";
private static final String ACCESS_KEY_SECRET = "";
public static synchronized OSS getOssClient() {
return OssUtil.getOssClient();
}
@Override
public ZhsqWjgl uploadFileToOss(MultipartFile file) throws IOException {
if (file == null) {
throw new RuntimeException("上传文件不能为空!");
}
return this.uploadFileToOss(file.getOriginalFilename(), file.getInputStream());
}
public ZhsqWjgl uploadFileToOss(String originalFilename, InputStream inputStream) {
return this.uploadFileToOss(originalFilename, inputStream, FOLDER);
}
public ZhsqWjgl uploadFileToOss(String originalFilename, InputStream inputStream, String folder) {
//拼接上传路径
String path = getOssUploadFileDir(folder);
if (originalFilename == null) {
throw new RuntimeException("文件名不能为空!");
}
List<String> files = Arrays.asList(originalFilename.split("\\."));
String wjlx = files.get(files.size() - 1);
//随机生成uuid作为新文件名一部分防止文件重复
String wjuuid = IdUtil.fastSimpleUUID();
String fileName = wjuuid.concat("." + wjlx);
path = path + fileName;
//FileUtil.type
String contentType = getContentType(originalFilename);
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType(contentType);
getOssClient().putObject(BUCKET, path, inputStream, objectMetadata);
log.info("上传文件:{},文件类型:{},原始文件名:{} ", PREFIX + path, contentType, originalFilename);
ZhsqWjgl zhsqWjgl = new ZhsqWjgl();
zhsqWjgl.setWjuuid(wjuuid);
zhsqWjgl.setWjlx(wjlx);
zhsqWjgl.setYswjmc(originalFilename);
zhsqWjgl.setCcwjmc(fileName);
zhsqWjgl.setWjfwurl(PREFIX + path);
zhsqWjgl.setCclj(path);
return zhsqWjgl;
}
public String getSTSToken(String url) {
Date date = new Date(System.currentTimeMillis() + 15 * 60 * 1000);
URL newUrl = getOssClient().generatePresignedUrl(BUCKET, url.substring(1), date);
String ossUrl = newUrl.toString();
return ossUrl.split("\\?")[1];
}
private String getOssUploadFileDir(String folder) {
if (folder == null) {
folder = FOLDER;
}
StringBuilder path = new StringBuilder();
path.append(folder).append("/");
LocalDateTime now = LocalDateTime.now();
int monthValue = now.getMonthValue();
String monthSTr = String.valueOf(monthValue);
if (monthValue < 10) {
monthSTr = "0" + monthValue;
}
int dayValue = now.getDayOfMonth();
String dayStr = String.valueOf(dayValue);
if (dayValue < 10) {
dayStr = "0" + dayValue;
}
path.append(now.getYear()).append("/").append(monthSTr).append("/").append(dayStr).append("/");
return path.toString();
}
//解决上传阿里云无法预览问题
private static String getContentType(String FilenameExtension) {
if (StringUtils.isEmpty(FilenameExtension)) {
return "image/jpg";
}
if (FilenameExtension.endsWith(".pdf")) {
return "application/pdf";
}
if (FilenameExtension.endsWith(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.endsWith(".gif")) {
return "image/gif";
}
if (FilenameExtension.endsWith(".jpeg") || FilenameExtension.endsWith(".jpg")) {
return "image/jpg";
}
if (FilenameExtension.endsWith(".png")) {
return "image/png";
}
if (FilenameExtension.endsWith(".html")) {
return "text/html";
}
if (FilenameExtension.endsWith(".txt")) {
return "text/plain";
}
if (FilenameExtension.endsWith(".vsd")) {
return "application/vnd.visio";
}
if (FilenameExtension.endsWith(".pptx") || FilenameExtension.endsWith(".ppt")) {
return "application/vnd.ms-powerpoint";
}
if (FilenameExtension.endsWith(".docx") || FilenameExtension.endsWith(".doc")) {
return "application/docx";
}
if (FilenameExtension.endsWith(".xlsx")) {
return "application/xlsx";
}
if (FilenameExtension.endsWith(".xls")) {
return "application/xls";
}
if (FilenameExtension.endsWith(".xml")) {
return "text/xml";
}
if (FilenameExtension.endsWith(".mp4")) {
return "video/mp4";
}
return "image/jpg";
}
/**
* url 转 MultipartFile
*
* @url:图片URL
* @fileName:文件名
* @return:返回的文件
*/
@Override
public MultipartFile urlToMultipartFile(String url, String fileName) throws Exception {
File file = null;
MultipartFile multipartFile = null;
try {
HttpURLConnection httpUrl = (HttpURLConnection) new URL(url).openConnection();
httpUrl.connect();
file = inputStreamToFile(httpUrl.getInputStream(), fileName);
multipartFile = fileToMultipartFile(file);
httpUrl.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return multipartFile;
}
@Override
public OSS getAliOSSClient() {
return getOssClient();
}
@Override
public AliOssConfigVo getAliOssConfig(int maxFileSize) throws UnsupportedEncodingException {
maxFileSize = Math.min(Math.max(maxFileSize, 5), 500);
String ossUploadFileDir = getOssUploadFileDir(null);
long expireEndTime = System.currentTimeMillis() + 60 * 1000 * 5; //过期时间 100 秒
Date expiration = new Date(expireEndTime);
// PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
PolicyConditions policyConds = new PolicyConditions();
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1024L * 1024 * maxFileSize);
policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, ossUploadFileDir);
String postPolicy = getOssClient().generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = getOssClient().calculatePostSignature(postPolicy);
return AliOssConfigVo.builder().maxFileSize(maxFileSize).dir(ossUploadFileDir).signature(postSignature).policy(encodedPolicy).OSSAccessKeyId(ACCESS_KEY_ID).host(PREFIX).build();
}
public File inputStreamToFile(InputStream ins, String name) throws Exception {
File file = new File(System.getProperty("java.io.tmpdir") + File.separator + name);
OutputStream os = new FileOutputStream(file);
int len = 8192;
byte[] buffer = new byte[len];
int bytesRead;
while ((bytesRead = ins.read(buffer, 0, len)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
return file;
}
public MultipartFile fileToMultipartFile(File file) {
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(16, null);
FileItem item = diskFileItemFactory.createItem(file.getName(), "text/plain", true, file.getName());
int bytesRead = 0;
byte[] buffer = new byte[8192];
try {
FileInputStream fis = new FileInputStream(file);
OutputStream os = item.getOutputStream();
int len = 8192;
while ((bytesRead = fis.read(buffer, 0, len)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
return new CommonsMultipartFile(item);
}
}