4

我想将一些 mp3 存储在一个不公开的文件夹中,不能通过网络直接访问,并且只有在用户登录时才允许用户使用浏览器收听/下载歌曲。

我怎样才能做到这一点?

我使用 Django 进行 Web 开发,但如果我知道它是如何工作的就足够了。

4

3 回答 3

5

您首先需要设置身份验证。django 教程彻底探讨了这一点。

您不直接链接 mp3,而是链接到检查身份验证的 django 脚本,然后读取 mp3 并将其提供给带有 mp3 内容类型标头的客户端。

http://yourserver.com/listen?file=Fat+Boys+Greatest+Hits

于 2010-07-06T18:32:03.167 回答
4

我假设你使用 django。然后你可以尝试这样的事情:

from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse


@login_required
def listen(request, file_name):
    # note that MP3_STORAGE should not be in MEDIA_ROOT
    file = open("%smp3/%s" % (settings.MP3_STORAGE, file_name))
    response = HttpResponse(file.read(), mimetype="audio/mpeg")
    return response

请注意,您将显着降低速度。使用生成器读取块中的文件可能有助于节省内存。

在 Python 中读取大文件的惰性方法?

于 2010-07-06T18:53:20.077 回答
4
  • 公共访问之外的文件(不在 MEDIA_URL 文件夹中)
  • 检查用户是否登录
  • 仅通过视图提供文件,每个用户都有唯一的链接

伪代码:

class Mp3(models.Model):
    file = models.FileField(upload_to=path_outside_of_public_access)
    hash = models.CharField(unique=True)


def generate_link_hash(request, file):
    return hashlib.md5("%s_%i_%s_%s" % (request.session.session_key, file.id, str(file.date_added), file.hash)) # or however u like


def files_list(request)
    """ view to show files list """
    for file in files:
        file.link_hash = generate_link_hash(request, file)


@login_required
def download_file(request, file_hash, link_hash):
    """ view to download file """
    file = Mp3.objects.get(hash=file_hash)
    if link_hash == generate_link_hash(request, file):
        file = open(file.file)
        return HttpResponse(file.read(), mimetype="audio/mpeg")
    else:
        raise Http404

应该做足够的工作,但请记住 - 一旦访问,您将无法控制它从现在开始的位置。而且每次下载文件都需要通过app读取文件(不是静态给出的),这会影响你app的性能。

于 2010-07-06T19:19:51.830 回答