阿里云OSS实现图片预览访问而不是下载

内容如标题,本人想实现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 

效果如下,基本效果已完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值