django-如何通过链接下载上传的文件

时间:2019-10-02 08:10:41

标签: django file downloadfile

我正在上传文件,并将其保存在媒体文件夹之外的文件夹中。我想在模板中添加下载链接,以便能够直接下载文件。我不确定要在网址中添加什么内容,如果我应该添加一些内容

我在未找到网址的模板中尝试了此操作

<a href="{{data.tar_gif.url}}"> Download File</a>

views.py

def uploaddata(request):
        if request.user.is_authenticated:

                if request.method == 'POST':

                        form = uploadform(request.POST, request.FILES)
                        if form.is_valid():
                                form.save()

                                return redirect('file_list')
                else:
                        form = uploadmetaform()

                return render(request, 'uploaddata.html', {
                        'form': form
                })
        else:
                return render(request, 'home.html')

html页面


    <tbody>
        {% for data in dataset %}
        <tr>
            <td>{{data.path_id}}</td>
            <td>{{ data.tar_gif }}</td>

            <td>
                <a href="{{data.document.url}}"> Download File</a>


                </td>
        </tr>
        {% endfor %}
    </tbody>

models.py


class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    Assigned_Group= models.CharField(max_length=500, choices=Group_choices, default='Please Select')

    def __str__(self):
        return self.user.username

# upload file #

def nice_user_folder_upload(instance, filename):
    extension = filename.split(".")[-1]
    return (
        f"{instance.user_profile.Assigned_Group}/{filename}"
    )

class uploadmeta(models.Model):

    path = models.ForeignKey(Metadataform, on_delete=models.CASCADE)

    user_profile = models.ForeignKey(UserProfile, on_delete=models.CASCADE, null=True, verbose_name='Username')


    document = models.FileField(upload_to=nice_user_folder_upload, verbose_name="Dataset") # validators=[FileExtensionValidator(allowed_extensions=['tar', 'zip'])]


    def __str__(self):
        return self.request.user

3 个答案:

答案 0 :(得分:1)

1.settings.py:

MEDIA_DIR = os.path.join(BASE_DIR,'media')
#Media
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'

2.urls.py:

from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

3.in 模板:

<a href="{{ file.url }}" download>Download File.</a>

在 django 中工作和测试 >=3

有关更多详细信息,请使用此链接: https://youtu.be/MpDZ34mEJ5Y

答案 1 :(得分:0)

使用html download 属性的实际简单方法 实现此目标的方法是

<a href="{{data.document.url}}" download> Download File</a>

或者您也可以使用:

<a href="{{ data.document.url }}" download="{{ data.document.url }}"> Download File</a>

答案 2 :(得分:0)

看这个帖子: How to serve downloadable files using Django (Chris Gregori) ?

也许更好的方法是不公开文件的路径,即使您确实想要公开文件的名称也是如此。我不喜欢这种显示用户路径的结构的想法。您可以通过此操作完成的其他事情是,如果您检查了请求,则可以验证谁可以下载文件。数据库中的每个文件都已提供给用户,而且非常简单。

基本上,发布是指使用xsendfile模块,因此django生成文件(或文件本身)的路径,但是实际的文件服务由Apache / Lighttpd处理。设置mod_xsendfile后,与视图集成将需要几行代码:“

from django.utils.encoding import smart_str

response = HttpResponse(mimetype='application/force-download') # mimetype is replaced by content_type for django 1.7
response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name)

response['X-Sendfile'] = smart_str(path_to_file)
# It's usually a good idea to set the 'Content-Length' header too.
# You can also set any other required headers: Cache-Control, etc.
return response

正如我之前所说,我不喜欢发布文件路径的想法。

有了此指向信息的指针,您就可以研究并开始工作。

希望它对您有用。