常用功能:Email / 文件上传&下载 / 错误异常 /

更多
2022年01月04日 08点41分 作者:叶飞 修改

文件上传

安全/限制

注意:病从口入

限制文件上传大小:不能几十个G的文件啪啪啪的网上传!

判断文件类型:(复习:文件/操作系统/IO

  • 后缀名:防君子,后缀名仅供windows便捷的确定文件类型,自动呈现图标、确定调用软件等
  • 文件头:防小人,操作系统按文件头确定文件的读写方式
  • 杀毒查木马:防恶人

不存储在数据库

因为:
  • 避免恶意文件“混入”数据库
  • 数据库更贵:早年习惯……
  • 使用CDN(复习)不方便

方案:

  • 文件本身自己存(操作系统管理的)磁盘
  • 数据库存(相对于网站根目录)路径,比如:/article/834/示意图.jpg

路径/名称规划

当需要上传的文件/图片很多的时候,一般我们要考虑以下几个因素:

1、重名和覆盖

如果使用客户端上传的文件名,就有可能:后上传的同名文件覆盖/不能覆盖之前保存的同名文件。

我们要考虑用户的意图:

  • 就是要上传一个新文件覆盖之前旧文件呢,
  • 还是上传的另外一个新文件?

如果要覆盖,我们也有两种方式:

  1. 真正的用同名新文件覆盖旧文件
  2. 只是在数据库中记录新的文件路径

所以会衍生出一个常见的套路:由服务器端重新生成文件名,比如:

  • 用户Id:一个用户只有唯一的一个,常用于用户的头像文件,即使用户上传时使用的是不同的文件,也可以实现方式1的同名文件真正覆盖
  • 随机数/GUID/时间戳等不重名的文件名:保护用户错误的覆盖(尤其是其他用户)之前上传的文件

当然,在能由路径确保操作的一定是当前用户自己的文件时,我们有可以使用用户自己原有的文件名,实现方式1的同名文件真正覆盖。这就需要规划好文件路径,比如,路径中包含:

  • 用户id:/user/12/帅帅的飞哥.jpg和/user/86/帅帅的飞哥.jpg不能相互覆盖
  • 文章id:/article/39/文件上传.jpg和/article/56/文件上传.jpg
  • 合用:/user-12/article-39/文件上传.jpg
  • ……

2、检索性能

规划好目录树,合理配置文件夹和文件,能够大幅提高文件的检索效率。

  • 一个文件夹下文件太多,或者
  • 文件的目录结构过深

都会导致检索文件困难,耗时过多。

飞哥推荐按年/月/日(月日可选)组织,比如:

  • 2019
    • 11
    • 12
  • 2020
    • 1
    • 2
      • 1
      • 2
      • 3
      • 4
      • ...
      • 28
    • 3
  • 2021

这样实现起来很简单,而且分布较为均匀。文件的名称可能是:~/images/2020/2/4/5293132738.jpg


动态文件输出

静态的文件输出(如:图片呈现、文件下载)是HTML的内容。

但有时候我们会在后台动态的生成一些文件,比如统计报表excel文件、辨别机器人的captcha图片等,这时候要理解:

  • 不需要先把文件存到硬盘上再输出
  • 前端(浏览器)无法区分也不会区分我接收到的是一个“磁盘上的、静态的”文件,还是一个“动态的”文件,就像无法区分静态/动态页面一样
  • 文件本质就是“流(stream)”,无论它是在网络还是在磁盘


错误处理

错误,可以细分为两种:bug和exception复习

  • bug应该尽可能的修复(fix)
  • exception一般只能记录或者恢复

无论哪种,都应该

尽可能早的暴露

前端的bug开发人员其实很难发现的,比如HTML上图片缺失、样式不对、JavaScript不能正常运行……这种bug基本上只有靠测试和用户。尤其是用户,给用户一个简洁方便的反馈渠道非常重要!

后端的错误,如果是

  • 逻辑性的(bug),比如取最大值时漏了一位、本来应该发送给张三的消息给了李四,我们一般也不容易发现,处理方式也只能同前端bug一样,只能依靠测试和用户
  • 异常性质的,被抛出来了,我们就可以发现它,然后对其进行处理!

#体会:为什么要防御式编程?尽可能的将逻辑性bug暴露出来#

错误页面

Web项目中,对异常的处理,除了catch…log和finally…恢复以外,还涉及到:要给用户一个说法,究竟发生了啥事?体现为:

  • 状态码(status code):比如404、500……(复习)
  • 用户友好的提示
    • 传统的、服务端页面项目,通常就是要转到一个错误页面,比如/article/9876543,一般都是30X重定向实现
    • Ajax驱动的、前后端分离的项目,通常都是给一个弹出框提示

这里面一定要注意的是:

  • 一般会有一个全局控制:处理所有未处理(unhandled)的异常
  • 不要暴露(调试用)堆栈信息,@想一想@:为什么?
  • 报错页面不要再有错误(最好是静态页面),否则就会行成死循环



Web开发 文件 错误异常 缓存
赞: 0 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

后台开发


其他:WebForm和WebApi

其他ASP.NET框架,如WebForm、WebApi……

RazorPages(Core)

微软推荐的、最新的、基于Razor页面和.NET core的新一代Web项目开发技术,包括Razor Tag Helper、Model绑定和Validation、Session/Cookie、内置依赖注入等……

MVC(Framework)

过去两年间最流行的、基于.NET Framework和MVC模式的ASP.NET MVC框架,主要用于讲解安全、性能、架构和各种实战功能演示……

C#语法

从入门的变量赋值、分支循环、到面向对象,以及更先进的语言特性,如:泛型、Lambda、Linq、异步方法等…………

Java语法

面向过程的变量赋值、分支循环和函数封装;面向对象的封装、继承和多态;以及更高阶的常用类库(集合/IO/多线程……)、lambda等

Java Web开发

分层架构和综合实战

J&C

Java和C#共有的语法

全部
关键字



帮助

反馈