zoukankan      html  css  js  c++  java
  • 解决Minio生成图片文件的分享链接无法正常下载的问题

    前言

    Minio作为很出名的文件存储服务, 因其开源和使用便利等优点被很多公司采用

    Minio的官网 点我

    在使用中, 我发现在Minio中存储图片文件时, 会因为图片文件的特性, 当你生成分享链接时, 通过链接访问出来的并不是下载流而是直接打开, 本文介绍原因和解决办法

    正文

    原因

    浏览器根据响应的 Content-Type 来确定文件格式, 当我们上传一个图片到 minio 时, 默认时会将图片自动识别, 其 Content-Type 为 image/png 于是当我们访问时则会在浏览器直接打开

    而我们直接上传一个文件, 再通过链接进入发现其 Content-Type 为 application/octet-stream, 此时可以正常下载

    根据资料显示确实如此

    runoob

    所以如果我们在图片上传如果能将其修改为文件而不是图片即可解决问题

    我们查看 Minio 的 Golang客户端文档

    找到其上传文件的文档, 发现方法中有一个参数为 opts, 其为 minio.PutObjectOptions 类型, 其中有一个参数为 opts.ContentType

    PutObject

    我们在代码中实现为

    // UploadToFDB upload to FDB
    func UploadToFDB(object, file string) error {
    	opts := minio.PutObjectOptions{
    		ContentType: "application/octet-stream",
    	}
    	_, err := FDB.FPutObject(ctx, tools.EnvConfig.Minio.Bucket, object, file, opts)
    	if err != nil {
    		tools.Log.Error("upload to FDB error", zap.Error(err))
    		return err
    	}
    	return nil
    }
    
    

    测试发现上传到Minio后识别为文件了, 而且生成的链接可正常下载

    而后我又发现其实在生成分享链接时也可以指定 response 的头, 如果将其强制指定为 application/octet-stream 应该也可以解决问题

    我们查看文档的 PresignedGetObject 部分, 其参数中有一个 reqParams 可以指定 response-content-type 参数, 所以我们可以修改生成分享链接的代码为

    // ShareFromFDB share
    func ShareFromFDB(object string) (string, error) {
    	reqParams := make(url.Values)
    	reqParams.Set("response-content-type", "application/octet-stream")
    	if _, err := FDB.StatObject(ctx, tools.EnvConfig.Minio.Bucket, object, minio.StatObjectOptions{}); err != nil {
    		return "", err
    	}
    	url, err := FDB.PresignedGetObject(ctx, tools.EnvConfig.Minio.Bucket, object, time.Second*60*60*24*7, reqParams)
    	if err != nil {
    		tools.Log.Error("share From FDB error", zap.Error(err))
    		return "", err
    	}
    	return url.String(), nil
    }
    
    

    经测试此方法无需在上传时指定 Content-Type 也可以达到一样的效果

        作者:ChnMig

        出处:http://www.cnblogs.com/chnmig/

        本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!

        如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击左下角的 [推荐],谢谢!

  • 相关阅读:
    C# Mongo Client 2.4.2创建索引
    MongoDB Driver:使用正确的姿势连接复制集
    C# Mongo Client 2.4.2判断是否存在表
    c# Mongodb批量更新
    c# Mongodb创建自增列
    class A where T:new()是什么意思
    Dapper Extensions中修改Dialect
    golang 中的 sizeof 以及 golang中的 union
    将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct
    golang 与 c语言 之间传递指针的规则提案
  • 原文地址:https://www.cnblogs.com/chnmig/p/14329296.html
Copyright © 2011-2022 走看看