OSS 获取强制下载地址

OSS链接在浏览器中打开,某些文件会直接打开不会下载,如何强制下载

1、获取签名地址,并将参数进行替换 IE 及 Chrome 都可以兼容此方法。文件名都不会有中文乱码。

     /**
     * OSS 获取强制下载地址URL
     * 如有有问题请先查看是有存在字符URLEncoder编码与OSS编码不一致
     *
     * @param key
     * @param name
     * @return
     */
    private String getOSSDownloadUrl(String key, String name) {
        if (ossTemplate.isExistKey(key)) {
            try {
                String nameEncoder = encoder(name);

                String attachment = new StringBuffer("?response-content-disposition=attachment;filename=").append(nameEncoder).append(";filename*=UTF-8''").append(nameEncoder).toString();
                String attachmentEncoder = encoder(attachment);

                String ossResultUrl = ossTemplate.getAccessUrlByPrivate(new StringBuffer(key).append(attachment).toString(), 3600 * 4);
                String replaceOssResultUrl = ossResultUrl.replace(attachmentEncoder + "?", attachment + "&");

                return replaceOssResultUrl.replaceAll(nameEncoder, encoder(nameEncoder));
            } catch (UnsupportedEncodingException e) {
                log.error("编码错误", e);
            }
        }
        return null;
    }

    /**
     * encodeURL
     * 解决URLEncoder 编码规则不匹配方法
     *
     * @param s
     * @return
     */
    private String encoder(String s) throws UnsupportedEncodingException {
        String encoder = URLEncoder.encode(s, "UTF-8");
        encoder = encoder.replaceAll("\\+", "%20");
        encoder = encoder.replaceAll("\\*", "%2A");
        return encoder;
    }

2、上传时直接设置 http头,filename 要进行编码,否则在IE中下载中文名称会乱码
在这里插入图片描述
在这里插入图片描述

<think>我们正在解决OSS跨域访问配置问题。根据引用内容,跨域问题通常是由于CORS(跨域资源共享)策略未正确配置导致的。以下是解决方案: 1. **在阿里云OSS控制台配置CORS规则**: - 登录阿里云OSS控制台,进入目标Bucket的“权限管理” > “跨域设置”。 - 点击“创建规则”,按照以下示例配置: - 来源(AllowedOrigin):填写允许访问的域名(例如`http://localhost:3000`或`https://yourdomain.com`),注意要包含协议和端口(非80端口需指定)。 - 允许方法(AllowedMethod):根据需求选择(如GET、HEAD等)。 - 允许头部(AllowedHeader):可填写`*`表示允许所有。 - 暴露头部(ExposeHeader):按需填写(如`ETag`, `Content-Length`等)。 - 缓存时间(MaxAgeSeconds):设置预检请求的有效期(例如3600秒)。 - 保存规则。 2. **验证配置**: - 配置后需等待几分钟生效。 - 通过浏览器开发者工具查看网络请求,确认响应头中是否包含`Access-Control-Allow-Origin`等字段。 3. **备选方案:后端代理**(适用于无法直接配置CORS的情况): - 在服务器端编写代理接口,由服务器从OSS获取资源并返回给前端,避免跨域限制。 > **注意**:配置CORS时务必精确指定来源域名,避免使用通配符`*`带来安全风险。若需允许多个域名,需逐个添加。 §§相关问题§§ 1. 如何验证OSS的CORS配置是否生效? 2. OSS的CORS规则支持哪些HTTP方法? 3. 使用通配符`*`配置来源域名有哪些安全风险? 4. 除了OSS配置,前端如何临时绕过跨域限制?</think>### OSS 跨域访问配置解决方案 根据您的需求,解决 OSS 跨域问题的核心方案是在阿里云控制台正确配置 CORS 规则。以下是具体操作步骤和注意事项: #### 解决方案步骤 1. **登录阿里云OSS控制台** - 进入目标Bucket → **权限管理** → **跨域设置** 2. **配置CORS规则**(参考引用[2][4]) ```json { "CORSRule": [ { "AllowedOrigin": [ "https://your-domain.com", // 生产环境域名 "http://localhost:3000" // 开发环境域名 ], "AllowedMethod": ["GET", "HEAD"], // 允许的HTTP方法 "AllowedHeader": ["*"], // 允许所有请求头 "ExposeHeader": ["Content-Length", "Content-Type"], "MaxAgeSeconds": 3600 // 预检请求缓存时间 } ] } ``` 3. **关键配置说明** - ✅ **AllowedOrigin**(来源域名): - 必须包含完整协议(http/https) - 非80端口需显式声明端口号(如`http://localhost:3000`) - 支持通配符`https://*.yourdomain.com`(每个域名仅允许一个`*`) - ❌ **常见错误**(引用[3]): - 遗漏协议或端口:`cwaiimage.oss-cn-beijing.aliyuncs.com`(错误) → `https://cwaiimage...`(正确) - 域名拼写错误:检查浏览器报错中的`Origin`头 4. **保存并生效** - 规则更新需 **1-5分钟** 生效 - 通过浏览器开发者工具验证响应头是否包含: ```http Access-Control-Allow-Origin: https://your-domain.com ``` #### 备选方案(引用[4]) 当无法直接配置CORS时: 1. **后端代理模式**: - 前端请求 → 自有服务器 → OSS获取数据 → 返回前端 - 优点:完全规避跨域限制 2. **前端临时方案**(仅开发环境): ```javascript fetch(url, { mode: 'no-cors' }) // 但会丢失响应头信息 ``` #### 配置验证方法 1. 使用curl测试: ```bash curl -I -H "Origin: http://your-domain.com" https://oss-file-url ``` 2. 检查返回头是否包含`Access-Control-Allow-Origin` > **重要提示**:若配置后仍报错,请检查浏览器缓存(强制刷新Ctrl+F5)或OSS规则优先级(多条规则时按顺序匹配)[^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值