内容如标题,本人想实现oss图片预览 翻阅网上解决办法, , 其次大致分为种
备注: 记得开文件读/读写权限
1: 设置请求头, 设置为image/jpg , (设置了, 发现并不好使)
2: 官方文档解决方法是绑定域名, 域名转发解析(你如果有域名可以试试, 没有建议放弃, 需要购买域名, 并且进行备案等相关操作, 本人卡在备案这一步上, 发现备案需要绑定服务器实例, 我是不愿意为了一个oss预览的功能再买个服务器的, 所以就果断放弃)
说一下方案, 我的方案是根据阿里云文件下载链接解析为流, 然后读取, 这样就能实现本地预览功能, 话不多说, 上代码
阿里云上传工具类:
application.yml:
aliyun:
oss:
bucketName: <yours>
endpoint: <yours>
accessKeyId: <yours>
secretAccessKey: <yours>
@Component
public class AliyunOssUtil {
@Value("${aliyun.oss.endpoint}")
private String ENDPOINT;
@Value("${aliyun.oss.accessKeyId}")
private String ACCESS_KEY_ID;
@Value("${aliyun.oss.secretAccessKey}")
private String ACCESS_KEY_SECRET;
@Value("${aliyun.oss.bucketName}")
private String BUCKET_NAME;
private OSS ossClient;
// 初始化OSS客户端
@PostConstruct
public void init() {
ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
}
// 上传文件到OSS
public void uploadFile(String objectName, File file) {
ossClient.putObject(new PutObjectRequest(BUCKET_NAME, objectName, file));
}
// 删除OSS上的文件
public void deleteFile(String objectName) {
ossClient.deleteObject(BUCKET_NAME, objectName);
}
// 获取文件URL
public URL getUrl(String objectName, int expires) {
// 设置URL过期时间为expires秒后
Date expiration = new Date(System.currentTimeMillis() + expires * 1000L);
return ossClient.generatePresignedUrl(BUCKET_NAME, objectName,expiration);
}
// 列出Bucket中的所有对象
public List<OSSObjectSummary> listAllObjects() {
ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(BUCKET_NAME));
List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
while (true) {
// 如果有下一批,继续获取
if (objectListing.isTruncated()) {
objectListing = ossClient.listObjects(String.valueOf(objectListing));
objectSummaries.addAll(objectListing.getObjectSummaries());
} else {
break;
}
}
return objectSummaries;
}
// 关闭OSS客户端
public void shutdown() {
ossClient.shutdown();
}
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
DefaultCredentialProvider credentialsProvider = CredentialsProviderFactory.newDefaultCredentialProvider("xxx", "xxx");
// 填写Bucket名称,例如examplebucket。
String bucketName = "xxx";
// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
String objectName = "images/1730102011057.jpg";
// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
String filePath = "D:\\word\\spring-ty\\src\\main\\resources\\static\\images\\1730102011057.jpg";
Date expiration = new Date(System.currentTimeMillis() + 10*60*60 * 1000L);
// // 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
System.out.println("图片访问链接:"+url);
//
// try {
// // 创建PutObjectRequest对象。
// PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
// // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.PublicRead);
// metadata.setContentType(getcontentType(objectName.substring(objectName.lastIndexOf("."))));
//
// putObjectRequest.setMetadata(metadata);
//
//
// // 上传文件。
// PutObjectResult result = ossClient.putObject(putObjectRequest);
// System.out.println(result.getVersionId());
// System.out.println(JSON.toJSONString(result));
// } catch (OSSException oe) {
// System.out.println("Caught an OSSException, which means your request made it to OSS, "
// + "but was rejected with an error response for some reason.");
// System.out.println("Error Message:" + oe.getErrorMessage());
// System.out.println("Error Code:" + oe.getErrorCode());
// System.out.println("Request ID:" + oe.getRequestId());
// System.out.println("Host ID:" + oe.getHostId());
// } catch (ClientException ce) {
// System.out.println("Caught an ClientException, which means the client encountered "
// + "a serious internal problem while trying to communicate with OSS, "
// + "such as not being able to access the network.");
// System.out.println("Error Message:" + ce.getMessage());
// } finally {
// if (ossClient != null) {
// ossClient.shutdown();
// }
// }
}
}
@RestController
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@RequestMapping("/file")
public class FileController {
private final AliyunOssUtil aliyunOssUtil;
/**
* 预览文件
* objectName为你上传时候存储oss输入的文件路径, 例如你objecetName为test/test.jpg, 那么objectName输入test/test.jpg
*/
@GetMapping("/priview")
public void priview(@RequestParam("objectName") String objectName, HttpServletResponse response) throws Exception {
URL url = aliyunOssUtil.getUrl(objectName, 36000);
System.out.println("获取文件下载访问链接:"+url);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
//设置超时时间
conn.setConnectTimeout(5 * 1000);
//通过输入流获取图片数据
InputStream inStream = conn.getInputStream();
boolean b = "jpg".contains(String.valueOf(url)) || "png".equalsIgnoreCase(String.valueOf(url)) || "gif".equalsIgnoreCase(String.valueOf(url));
if (b) {
response.setContentType("image/jpeg");
}
OutputStream outStream = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1)
{
outStream.write(buffer, 0, len);
}
inStream.close();
outStream.flush();
outStream.close();
}
}
然后浏览器输入链接如下:
http://localhost:8079/file/priview?objectName=images/1730102011057.jpg
效果如下,基本效果已完成