minio图片展示(minio图片上传地址为内网,展示时为外网)


一、minio图片服务器

拥有两个端口号,一个时web端控制台端口号,一个是上传时使用的端口号
在后端配置的是内网地址,直接使用minio返回的url进行展示的话,外网无法正常展示

二、图片展示

1.方法一:后端转发

代码如下(示例):
后端:

public void getImage(String bucketName, String fileName, HttpServletResponse response) throws IOException {
        InputStream in = null;
        try {
            in = minioClient.getObject(
                    GetObjectArgs.builder()
                            .bucket(bucketName)
                            .object(fileName)
                            .build()
            );
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (in == null){
            response.sendError(404, "未能找到图片");
        }


        //图片类型
        String[] fileArr = fileName.split("\\.");
        String contentType = "";
        StringBuilder originalFileName = new StringBuilder();
        if (fileArr.length > 1){
            contentType = "image/" + fileArr[fileArr.length - 1];
            for (int i = 0; i < fileArr.length - 1; i++) {
                originalFileName.append(fileArr[i]);
                if (i != fileArr.length - 2){
                    originalFileName.append(".");
                }
            }
        }else {
            contentType = "application/octet-stream";
            originalFileName = new StringBuilder(fileName);
        }

        try {
            response.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
            response.addHeader("X-Original-File-Name", originalFileName.toString());
            response.setContentType(contentType);
            ServletOutputStream outputStream = response.getOutputStream();
            IOUtil.copyCompletely(in, outputStream);
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

前端:

<img v-for="picture in picturesSrc"
                   :src="picture"
                   alt="图片"
                   style="width: 40px; height: 40px; display: inline-block; border-radius: 4px"
                   v-on:click="showPicture(picture)"
              />

......

this.picturesSrc = JSON.parse(row.fileName).map(fileName => {
        let encodeUrl = encodeURIComponent(fileName);
        return `${this.$config.baseUrl}/getImage?fileName=${encodeUrl}&bucketName=test`
      })


注意:这里之前写好的接口返回了图片名称,图片名称可能存在特殊字符,所以进行了加码处理

2.方法二:nginx代理
public List<String> getNginxObjectUrlByList(String bucketName, String fileNameList) {
        List<String> fileNames = JSON.parseArray(fileNameList, String.class);

        List<String> urlList =  new ArrayList<>();
        fileNames.forEach(res ->{
            urlList.add(getObjectUrl(bucketName, res).replace("内网地址+minio端口号", "外网地址/minio"));
        });

        return urlList;
    }
server {
        listen   80;
       
        location ^~ /minio/ {
            proxy_read_timeout 600s;
            #这里一开始用了127.0.0.1不好用,没看原因
            proxy_pass http://内网地址+minio端口号;
            
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header X-Special-Delivery "";
            proxy_set_header Access-Control-Allow-Origin "";
            proxy_set_header Proxy-Client-IP $remote_addr;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            add_header X-Special-Delivery "stop-polling-our-interface-you-bitch" always;
            add_header Access-Control-Allow-Origin "you-poll-your-mama-blyat" always;
        }

    }
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MinIO 中上传的文件默认情况下是私有的,只能由上传者本人进行访问。如果需要获取永久的公开访问地址,可以使用 MinIO 提供的 Presigned URL 功能。 Presigned URL 是一种特殊的 URL,可以用于授权访问 MinIO 中的文件。使用 Presigned URL,您可以授权其他人访问 MinIO 中的文件,而无需将访问权限授予整个桶或对象。Presigned URL 的有效期由您自己指定,可以设置为永久。 以下是使用 MinIO Python SDK 生成 Presigned URL 的示例代码: ```python from minio import Minio from datetime import datetime, timedelta # 初始化 MinIO 客户端 client = Minio( endpoint='minio.example.com', access_key='YOUR_ACCESS_KEY', secret_key='YOUR_SECRET_KEY', secure=False ) # 获取一个对象的 Presigned URL bucket_name = 'my-bucket' object_name = 'my-object' expires_in_days = 3650 # 设置有效期为 10 年 # 计算过期时间 expires_at = datetime.utcnow() + timedelta(days=expires_in_days) # 生成 Presigned URL url = client.presigned_get_object( bucket_name=bucket_name, object_name=object_name, expires=expires_at ) print(url) ``` 在上述示例代码中,`expires_in_days` 变量用于设置 Presigned URL 的有效期,单位为天。`expires_at` 变量则是计算出来的 Presigned URL 的过期时间,使用了当前时间加上有效期这个计算方法。`client.presigned_get_object` 方法用于生成 Presigned URL。最后打印出来的 `url` 就是生成的 Presigned URL。 注意,Presigned URL 指定的有效期过后,URL 将不再可用,需要重新生成。如果您需要永久地公开访问文件,建议将文件 ACL 设置为公共读取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值