字段未被保存的思考


title: “对于字段未存的思考”
data: 2022.9.27
tag:

  • 数据库
  • 类型

字段未保存下来的思考

背景

  • 项目在文件上传后的,无法进行下载

原因分析

  • 检查发现后端返回的数据长度与上传不一致

  • 后端数据库存储的数据是有大小限制的。

  • 文件地址字段,在后台数据库mysql中设置的是512个字符

  • 前端通过OSS上传后拿到的是经过编码(encodeURI)后的地址。一个中文字符会被编译为9个普通字符。

  • 因为用户上传时保留了上传的名字,就有可能使得超过512个字符,导致数据库存不下来


解决办法

  • oss上传的时候命名采用MD5,不保留原始文件名

  • 弊端:下载的时候无法看到名称

  • oss上传的时候设置请求headers的’Content-Disposition’为’attachment;filename= encodeURI(文件名)';需要对中文名进行编码

  • 下载的时候浏览器会读取这个字段的文件名进行下载


扩展

字节、字符和比特

  1. acsll码下 1字符=1字节 存储的最大字符数256 2^8 不支持中文

  2. Unicode码 1字符=2字节 存储的最大字符数65535 2^16 不兼容acsll

  3. utf-8码下 1字符=3字节(汉字一般3字节;理论最长4字节) 兼容acsll(变长编码。所以可以兼容)

  4. GBK 1个=2个字节(汉字一般为2字节;acsll字符为1字节)

  • mysql一般用字符做单位
  • 1字节=8bit

下载方式(四种)

  1. 上面那种通过设置OSS的header
  2. 地址栏直接打开。浏览不预览的直接下载,预览的 需要用户自己手动下载
  3. 请求文件地址,成功后将二进制文件读取为Blob,使用URL.createObjectURL生成Blob url,创建a链接模拟点击。存在兼容性问题、大文件体验不好
  4. a链接直接设置download。缺点:不支持跨域
// 第三种
fetch(url).then(res => {
  res.blob().then(blob => {
    const blobUrl = window.URL.createObjectURL(blob)
    const a = document.createElement('a')
    a.href = blobUrl
    a.download = name
    a.click()
    window.URL.revokeObjectURL(blobUrl)
  })
})

结束

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值