权鸣的个人随笔

关于Minio 6.8版本外链的问题记录

minio外链过期时间问题

因为需要将minio的图片地址发送至钉钉并推送至钉钉群,会出现钉钉发送的图片无法打开的情况,尝试给minio发送的图片加上外链之后,问题的到解决。

            return  minioClient.getPresignedObjectUrl(
                    GetPresignedObjectUrlArgs.builder()
                            .method(Method.GET)
                            .bucket(bucketName)
                            .object(objectName)
                            .build());
        }
    /**
     * 获取文件外链
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @param expires 过期时间 <=7 秒级
     * @return url
     */
    public static String getPresignedObjectUrl(String bucketName, String objectName,
                                               Integer expires)
            throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, InvalidExpiresRangeException, ServerException, InternalException, NoSuchAlgorithmException, XmlParserException, InvalidBucketNameException, ErrorResponseException {


        return  minioClient.getPresignedObjectUrl(
                GetPresignedObjectUrlArgs.builder()
                        .method(Method.GET)
                        .bucket(bucketName)
                        .object(objectName)
                        .build());
    }

今天得到一个额外的需求,需要将minio图片的地址存储在数据库中并支持预览。 因为原本的图片地址存在过去时间,而默认是查看源码发现 必须存在过期时间的。

static {
    DEFAULT_EXPIRY_TIME = (int)TimeUnit.DAYS.toSeconds(7L);
}

思考为何加上外链后钉钉能够正常展示,并观察minio存储的文件格式 查看源码后发现:默认存储的contentType为 octet-stream


public String contentType() throws IOException {
    String contentType = super.contentType();
    return contentType != null ? contentType : "application/octet-stream";
}

这样就会导致浏览器打开文件默认是下载

解决方案:
在putObject上传文件时 指定contentType

    /**
 * 通过流上传文件
 *
 * @param bucketName 存储桶
 * @param objectName 文件对象
 * @param inputStream 文件流
 */
public static ObjectWriteResponse putObject(String bucketName, String objectName,
                                            InputStream inputStream,String contentType)
        throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException {
    return minioClient.putObject(
            PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType).stream(
                    inputStream, inputStream.available(), -1)
                    .build());
}

图片的则设置为 "image/png" 即可。
这样即使不用外链将图片发送给钉钉也能达到正常显示的效果,浏览器也可以正常打开

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »