插件窝 干货文章 Django项目中如何解决阿里云OSS视频下载时浏览器直接播放的问题?

Django项目中如何解决阿里云OSS视频下载时浏览器直接播放的问题?

bucket Disposition video Content 718    来源:    2025-03-15

在Django项目中,如果你使用阿里云OSS存储视频文件,并且希望用户在浏览器中点击下载链接时直接下载视频而不是播放,你可以通过设置HTTP响应头中的Content-Disposition来实现。具体来说,你可以通过设置Content-Dispositionattachment来强制浏览器下载文件,而不是直接播放。

以下是解决这个问题的步骤:

1. 使用阿里云OSS SDK生成预签名URL

阿里云OSS提供了生成预签名URL的功能,你可以通过设置response-content-disposition参数来控制下载行为。

import oss2

# 初始化OSS客户端
auth = oss2.Auth('your-access-key-id', 'your-access-key-secret')
bucket = oss2.Bucket(auth, 'https://your-bucket-endpoint', 'your-bucket-name')

# 生成预签名URL,并设置Content-Disposition为attachment
url = bucket.sign_url('GET', 'your-video-key', 3600, params={
    'response-content-disposition': 'attachment; filename="your-video-filename.mp4"'
})

print(url)

2. 在Django视图中返回预签名URL

在你的Django视图中,你可以生成预签名URL并将其返回给前端。

from django.shortcuts import render
import oss2

def download_video(request):
    # 初始化OSS客户端
    auth = oss2.Auth('your-access-key-id', 'your-access-key-secret')
    bucket = oss2.Bucket(auth, 'https://your-bucket-endpoint', 'your-bucket-name')

    # 生成预签名URL,并设置Content-Disposition为attachment
    video_key = 'your-video-key.mp4'
    url = bucket.sign_url('GET', video_key, 3600, params={
        'response-content-disposition': f'attachment; filename="{video_key}"'
    })

    # 返回URL给前端
    return render(request, 'download.html', {'download_url': url})

3. 在前端页面中使用生成的URL

在前端页面中,你可以使用生成的URL作为下载链接。

<!-- download.html -->
<a href="{{ download_url }}" download>下载视频</a>

4. 直接通过Django视图提供下载

如果你不想使用预签名URL,而是希望通过Django视图直接提供下载,你可以使用HttpResponse来设置Content-Disposition头。

from django.http import HttpResponse
import oss2

def download_video(request):
    # 初始化OSS客户端
    auth = oss2.Auth('your-access-key-id', 'your-access-key-secret')
    bucket = oss2.Bucket(auth, 'https://your-bucket-endpoint', 'your-bucket-name')

    # 获取视频对象
    video_key = 'your-video-key.mp4'
    video_object = bucket.get_object(video_key)

    # 设置Content-Disposition头
    response = HttpResponse(video_object.read())
    response['Content-Disposition'] = f'attachment; filename="{video_key}"'
    response['Content-Type'] = 'video/mp4'

    return response

总结

通过设置Content-Dispositionattachment,你可以强制浏览器下载文件而不是直接播放。你可以选择使用阿里云OSS的预签名URL功能,或者通过Django视图直接提供下载。这两种方法都可以实现你想要的效果。