vue与django(drf)实现文件上传下载功能全过程

下面我将介绍通过Vue和Django(DRF)实现文件上传下载功能的全过程,包含以下几个步骤:

  1. 在Vue中创建文件上传表单并发送请求到Django后端;
  2. 在Django后端接收文件并保存到指定目录;
  3. 编写Django视图函数实现文件下载功能;
  4. 在Vue中调用视图函数完成文件下载。

1. 创建Vue文件上传表单并发送请求到Django后端

我们可以使用 axios 库发送文件上传请求。在表单处理方法中,我们需要创建一个FormData对象来存储文件数据,并调用axios发起POST请求。

以下是一个示例,上传表单中包含一个文件选择按钮和一个提交按钮:

<template>
  <div>
    <form @submit.prevent="uploadFile" enctype="multipart/form-data">
      <label for="file-upload">选择文件:</label>
      <input type="file" id="file-upload" ref="fileUpload" />
      <button type="submit">上传文件</button>
    </form>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  methods: {
    async uploadFile() {
      const file = this.$refs.fileUpload.files[0]
      const formData = new FormData()
      formData.append('file', file)
      const response = await axios.post('/api/upload/', formData)
      console.log(response.data)
    }
  }
}
</script>

在上面的示例中,我们使用了async/await语法来让方法异步执行,同时也使用了axios库来发起POST请求。在FormData对象的append方法中,我们指定了文件上传时使用的字段名为'file'。POST请求的URL为'/api/upload/',该URL需要在Django后端进行路由绑定。

在Django的settings.py文件中,还需要添加如下配置以允许文件上传:

FILE_UPLOAD_HANDLERS = [
    'django.core.files.uploadhandler.MemoryFileUploadHandler',
    'django.core.files.uploadhandler.TemporaryFileUploadHandler',
]

2. 在Django后端接收文件并保存到指定目录

我们可以使用DRF提供的视图来处理文件上传请求。在视图函数中,我们可以使用request.FILES属性来获取上传的文件数据,并调用文件对象的save方法将文件保存到指定目录中。在保存文件的同时,我们可以通过HttpResponse返回包含上传文件路径的JSON数据。

以下是一个示例:

from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.http import HttpResponse
from rest_framework.decorators import api_view

@api_view(['POST'])
def upload_file(request):
    if request.method == 'POST' and request.FILES.get('file'):
        file = request.FILES['file']
        fs = FileSystemStorage(location=settings.MEDIA_ROOT)
        filename = fs.save(file.name, file)
        file_url = fs.url(filename)
        return HttpResponse({'file_url': file_url})

在上面的代码中,我们使用DRF框架提供的@api_view装饰器将该函数转换为Django视图函数。在request.FILES属性中,我们获取了上传的文件数据。然后,我们使用FileSystemStorage类初始化一个存储文件的对象,并使用save方法将文件保存到设置文件中MEDIA_ROOT指定的目录下。最后,我们通过HttpResponse返回一个JSON对象,其中包含文件的URL地址。

3. 编写Django视图函数实现文件下载功能

当需要下载文件时,我们可以定义一个Django的视图函数,该函数将从服务器提供的文件地址获取文件内容并以HTTP响应的方式返回给客户端浏览器。在文件下载视图函数中,我们首先需要获取要下载文件的路径,然后将该文件以二进制形式打开,并进行读取操作,最后将该文件以HttpResponse的方式返回给客户端。

以下是一个示例:

from django.http import HttpResponse

def download_file(request, file_url):
    # 根据文件URL获取文件路径
    file_path = file_url.replace('/media/', settings.MEDIA_ROOT + '/')
    with open(file_path, 'rb') as f:
        # 将文件以二进制形式读取
        file_data = f.read()
    response = HttpResponse(file_data, content_type='application/octet-stream')
    # 设置响应头,告诉浏览器返回的是附件,并指定文件名
    response['Content-Disposition'] = 'attachment; filename={}'.format(file_url.split('/')[-1])
    return response

在上面的代码中,我们定义了一个download_file视图函数,其参数为file_url。在该函数中,我们首先根据参数值获取真实的文件路径,然后以二进制形式读取文件内容,并将其返回给客户端。在返回时,我们设置了content_type为'application/octet-stream',告诉浏览器返回的是二进制流,同时在响应头中自定义了'Content-Disposition'参数,告诉浏览器返回的是附件并指定文件名。

4. 在Vue中调用视图函数完成文件下载

在Vue中,我们可以使用a标签来实现文件下载。以下是一个示例,该示例中定义了一个downloadFile方法,该方法被调用时将用户浏览器重定向到Django视图函数中指定的URL地址,从而完成文件下载。

<template>
  <div>
    <button @click="downloadFile(fileUrl)">下载文件</button>
  </div>
</template>

<script>
export default {
  methods: {
    downloadFile(fileUrl) {
      window.location.href = `/api/download/${fileUrl}`
    }
  }
}
</script>

在上面的示例中,我们使用了a标签,通过URL地址的方式来定位Django视图函数并进行文件下载。当下载按钮被点击时,我们调用了downloadFile方法,并将文件URL作为参数传递给该方法。在方法的实现中,我们使用window.location.href来完成页面重定向,从而触发浏览器下载文件的操作。

以上是Vue和Django(DRF)实现文件上传下载功能的完整攻略。在实际开发中,还需要处理一些细节问题,例如文件大小限制、文件类型校验、安全性等问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue与django(drf)实现文件上传下载功能全过程 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • nodejs+koa2 实现模仿springMVC框架

    简介 首先,需要了解nodejs和koa2的概念和基础知识。1. nodejs:JavaScript运行时,是一种基于Chrome V8引擎的解释器,可以解析和执行JavaScript语法。2. koa2:Node.js的web框架,是Express的基础上重构的新一代web框架,强调“中间件”(middleware)概念,由于使用了ES6新增的async函…

    Vue 2023年5月28日
    00
  • vue实现文字加密功能

    接下来我将详细讲解“vue实现文字加密功能”的完整攻略。 简介 在信息化的时代,对于个人隐私的保护越来越受到人们的关注。其中,对于敏感性文字的加密就显得尤为重要。因此,本文将介绍如何在vue项目中实现文字加密的功能。 准备工作 在开始实现之前,我们需要先进行以下准备工作: 安装vue-cli:在命令行界面中运行npm install -g vue-cli。 …

    Vue 2023年5月28日
    00
  • Vue.set 全局操作简单示例

    Vue.set()方法是Vue.js提供的全局操作,用于给Vue实例动态添加属性,并保证新添加的属性能够响应式地触发视图更新。以下是一个关于Vue.set()的攻略: 简介 Vue.set()的语法如下: Vue.set(object, key, value) 其中: object:Vue实例的一个数据对象 key:新添加的键 value:新添加的键对应的值…

    Vue 2023年5月27日
    00
  • vue3中的hooks总结

    下面是“Vue3中的Hooks总结”的完整攻略。 Vue3中的Hooks总结 什么是Hooks? Hooks是Vue3中新增的API,是一组可重用状态逻辑(如设置计时器或订阅数据源),它们可以按照需要任意组合,以用于构建自定义的Vue函数式组件。使用Hooks的函数式组件让我们使逻辑更加封装和优雅,且更易于迭代和测试。 总体而言,Hooks的目的是在不编写类…

    Vue 2023年5月28日
    00
  • vue中ref引用操作DOM元素的实现

    在Vue.js中,可以通过ref指令来获取DOM元素的引用,这使得我们可以在Vue组件中直接操作DOM元素。下面是实现这一功能的步骤。 步骤一:在DOM元素上添加ref指令 要获取一个DOM元素的引用,我们需要给它添加ref指令并指定一个名称。ref指令可以添加在任何元素上,如下所示: <template> <div> <but…

    Vue 2023年5月29日
    00
  • vue实例成员 插值表达式 过滤器基础教程示例详解

    我将为你讲解“vue实例成员 插值表达式 过滤器基础教程示例详解”的攻略。 Vue实例成员 Vue实例是最基本的构成单元,具有许多成员属性和方法。其中,常用的实例成员包括:data、methods、computed、watch等等。 data data属性是用来注册Vue实例的数据属性。它能让Vue跟踪数据的变化,当数据变化时,它会通知到相关的视图以及组件等…

    Vue 2023年5月27日
    00
  • 详解vue-cli快速构建vue应用并实现webpack打包

    下面是“详解vue-cli快速构建vue应用并实现webpack打包”的完整攻略: 一、安装vue-cli 在终端中输入以下代码安装vue-cli: npm install -g vue-cli 二、创建vue项目 通过以下命令创建一个基于webpack模板的vue项目: vue init webpack myapp 其中,myapp为项目名称,可根据自己的…

    Vue 2023年5月27日
    00
  • vue中计算属性computed理解说明包括vue侦听器,缓存与computed的区别

    让我们来详细讲解一下Vue中的计算属性computed。 计算属性computed 计算属性computed是Vue中常用的一个属性,它可以计算出新的值。在Vue中,当多个属性相关联时,我们可以使用计算属性computed来进行复杂的计算。 计算属性的使用 在Vue组件中使用计算属性computed,需要在Vue实例中添加computed属性,并返回一个新的…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部