首页 > 其他分享 >实现文件下载的两种方式及优缺点

实现文件下载的两种方式及优缺点

时间:2023-06-15 16:36:04浏览次数:26  
标签:文件 MEDIA 优缺点 file path ROOT 下载

1 两种方式

第一种方式是通过后端应用程序将文件传输到前端,即在后端代码中设置下载文件的响应头,使得前端用户在点击下载链接后,后端会将文件传输给前端进行下载。这种方式需要后端进行额外的处理,包括读取文件、设置响应头等,用户需要等待一定时间才能下载文件。此外,如果需要下载的文件比较大,可能会对服务器资源造成一定的压力。

code 例子:

def download_excel_file(file_path, filename):
    response = FileResponse(open(file_path, 'rb'),
                            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    response['Content-Disposition'] = 'inline; filename="{}"'.format(filename)
    return response

 

 

第二种方式是直接给前端一个文件地址,通过在前端代码中设置下载链接,使得用户点击链接后可以通过浏览器直接下载文件。这种方式不需要后端进行额外的处理,可以直接通过浏览器下载文件,用户体验更加友好,下载速度也更快。但是需要注意的是,如果文件地址暴露在公共的网络环境中,可能会存在文件泄露的风险。

 

2 优缺点

区别:   在于文件的传输方式和用户体验。

综上所述,两种方式各有优缺点,根据具体的需求和场景可以选择适合的下载方式

 

 

3 如何提高方式二的安全性,防止文件泄露和滥用

根据1)安全性降序和2)代码实现难度升序的原则,我对这6个办法进行排序如下:

  1. 限制文件下载权限:在后端设置文件下载的权限,只有有权限的用户才能下载文件,这种方式可以提高安全性,同时实现起来也比较简单,代码实现难度较低。

  2. 对文件进行安全验证:在下载文件之前,使用杀毒软件对文件进行扫描,防止下载到潜在的恶意文件。这种方式可以提高文件的安全性,代码实现难度较低。

  3. 加密文件地址:可以将文件地址进行加密,使得地址不易被猜测或者直接访问。这种方式可以提高安全性,但是需要前后端进行密钥的交换和加密算法的实现,代码实现难度较高。

  4. 使用HTTPs协议:使用HTTPS协议可以保证传输过程中的数据加密和安全性,但是需要在服务器上配置相应的证书,代码实现难度较高。

  5. 防止文件夹遍历攻击:在设置文件下载链接时,需要对文件路径进行过滤,防止通过修改URL地址实现文件夹遍历攻击。这种方式可以提高安全性,但是需要在后端进行额外的处理,实现起来比较麻烦,代码实现难度较高。

  6. 定期更新下载链接:定期更新下载链接可以防止下载链接被泄露和滥用,但是需要频繁地更新链接,对用户不太友好,同时也没有直接提高安全性的作用,代码实现难度较高

 

 -方式5的code示例 - 不一定正确-gpt给的

@method_decorator(csrf_exempt, name='dispatch')
class DownloadView(View):
    def get(self, request, file_path):
        # 通过正则表达式匹配文件路径,只允许字母、数字、下划线、短横线、斜杠/、点号、中文字符
        if not re.match(r'^[\w/-\.\u4e00-\u9fa5]+$', file_path):
            return HttpResponseForbidden()

        # 将文件路径与MEDIA_ROOT拼接成完整的文件路径
        file_full_path = os.path.join(settings.MEDIA_ROOT, file_path)

        # 判断文件是否存在,如果不存在返回404错误
        if not os.path.exists(file_full_path):
            return HttpResponseNotFound()

        # 判断文件是否在MEDIA_ROOT目录下,如果不是返回403错误
        if not os.path.abspath(file_full_path).startswith(settings.MEDIA_ROOT):
            return HttpResponseForbidden()

        # 如果文件存在且在MEDIA_ROOT目录下,则返回文件
        response = FileResponse(open(file_full_path, 'rb'))
        return response

在上述代码中,我们定义了一个DownloadView视图,当用户访问/download/file_path/时,会下载MEDIA_ROOT目录下的file_path文件。
为了防止文件夹遍历攻击,我们使用正则表达式过滤文件路径,只允许包含字母、数字、下划线、短横线、斜杠/、点号、中文字符的路径。
在返回文件之前,我们还判断了文件是否存在以及文件是否在MEDIA_ROOT目录下,以确保文件的安全性。
如果文件路径不合法或者文件不存在或者文件不在MEDIA_ROOT目录下,则返回相应的错误响应。如果一切正常,则返回文件的响应

 

标签:文件,MEDIA,优缺点,file,path,ROOT,下载
From: https://www.cnblogs.com/tslam/p/17483261.html

相关文章

  • .NET 文件上传服务设计
    .NET文件上传服务设计前言在b站学习了一个后端小项目,然后发现这个文件上传设计还挺不错,来实现讲解一下。项目结构如下:基于策略+工厂模式实现文件上传服务枚举在Model层创建即可publicenumUploadMode{Local=1,//本地上传Qiniu=2//七牛云......
  • springboot文件上传
    前言需要实现文件上传功能需要MultipartResolver接口的实现类的实例,这样才可以实现文件上传而MultipartResolver有两个实现类:StandardServletMultipartResolver:springboot中以自动配置完成,直接使用即可CommonsMultipartResolver:springmvc中使用的是CommonsMultipartReso......
  • 本地下载 web file操作
    functiondownload(){constlink=document.createElement('a')link.href=window.location.origin+`/static/doc/${this.type}.docx`+'?auth='+getToken()constfileName='20230615.docx'link.download=fil......
  • 利用 inotifywait 实现自动增量文件拷贝
    #!/bin/bashsrc=/www/wwwroot/site0/images/dest=/www/wwwroot/site1/images/tool=/user/bin/mytoolinotifywait-mrq--format'%w%f'-ecreate$src|whilereadfiledosleep1#从create到写好,有一个过程,等一下更安全rpath=$dest/${file:2......
  • python unitest 文件结构
    unittest框架的文件结构可以按照以下方式组织:1.导入所需的模块和类:在测试文件的开头,需要导入unittest模块以及待测试的模块或类。2.定义测试类:使用class关键字定义一个测试类,类名通常以"Test"开头,并继承unittest.TestCase类。3.定义测试方法:在测试类中,可以定义多个......
  • python发送文件
      发送端importsocketimportosimporttimefilename=input('pleaseenterthefilenameyouwanttosend:\n')filesize=str(os.path.getsize(filename))fname1,fname2=os.path.split(filename)client_addr=('127.0.0.1',9999)f=op......
  • C语言文件操作函数open、write用法速记
    以前一直都是用fopen、fwrite等高级函数写文件,这次尝试用open、write、close操作文件。代码如下:intret=OB_SUCCESS;intfd=open(config_file,O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU|S_IRWXG|S_IRWXO);staticconstint64_tbuf_len=512;int64_......
  • WinCE下的文件路径
    在WinCE下,不能用相对路径,必须用绝对路径(FullPath) 来定位文件。如,在ProgramFiles/TestProgram目录下的abc.txt文件,只能用ProgramFiles/TestProgram/abc.txt来定位,而不能用abc.txt定位。如:privatevoidbutton1_Click(objectsender,EventArgse){stringp......
  • Qt Qdebug 实现重定向到文件
    #include<QtCore/QCoreApplication>#include<QtCore/QDebug>#include<QtCore/QFile>#include<QtCore/QTextStream>//自定义消息处理函数voidmyMessageHandler(QtMsgTypetype,constchar*msg){   //打开输出文件   QFilefile("debug.log");   ......
  • C++ 文件和流
     到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。本教程介绍如何从文件读取流和向文件写入流。这就需要用到C++中另一个标准库 fstream,它定义了三个新的数据类型:数据类型描述ofstream该数据类......