文件上传了解

2018-10-11  本文已影响17人  zwj2024

1.上传方案

1、上传文件流到数据库
2、上传base64或者blob到数据库
3、当图片很多的时间,需要建立一个图片库,专门保存图片。然后将图片路径存到数据库

2.涉及需要掌握的点

1、Blob

2、base64编码

3、原生实现图片上传前后端代码实现-formData

4、上传图片预览

5、Blob URL和Data URL

3.项目中需要考虑的技术埋点

问题1: html自带file控件样式丑陋,如何达到UI设计要求效果;

btn.onclick = function() {
     file.click() // 调取系统选择图片的弹框
}

问题2: 选择图片后,按照一定的样式回显示图片如何实现;

FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL。Data URL是一项特殊的技术,可以将资料(例如图片)内嵌在网页之中,不用放到外部文件。使用Data URL的好处是,您不需要额外再发出一个HTTP 请求到服务器端取得额外的资料;而缺点便是,网页的大小可能会变大。它适合应用在内嵌小图片,不建议将大图像文件编码成Data URL来使用。您的图像文件不能够超过浏览器限定的大小,否则无法读取图像文件。

function previewImg(){
    let preview = document.querySelector('img[id=preview]');
    let file = document.querySelector('input[id=file]').files[0];
    let reader = new FileReader();
    reader.onloadend = function () {
        preview.src = reader.result;
    }
    if (file) {
        reader.readAsDataURL(file);
    } else {
        preview.src = "";
    }       
}

问题3: 无刷新提交,采用原始的ajax提交

1)let request = new XMLHttpRequest() 
2)request.open("POST", url) 
3)request.onload = function(oEvent) { 
     if (request.status == 200) { 
           //alert(“success”); 
     } else { 
            //alert(“出错啦!请稍后再试。” + request.status); 
     } 
   }; 
4) request.send(formData);

问题4: 序列化(serialize())表单是无法序列化二进制数据的,该如何提交文件类型?
故我们采用FormData的方式提交文件类型。
问题5: JS选择器获取单个文件、“multiple”类型多文件及非“multiple”类型的多个同类型input控件文件;
1)单个文件;

document.querySelector('input[id="file"]').files[0];

2)若是“multiple”类型的input控件,即一个input控件可以同时选择多个文件(<input type=”file” multiple=”multiple” />);

document.querySelector('input[id="file"]').files;
document.querySelector('input[id="file"]').files.length;
  1. 我们考虑下另外一种方式,采用追加的方式实现多图预览,譬如有多个id同为file的input组件,且全是单选,这些照片为一组,需要统一获取并上传;
let files = document.querySelectorAll('input[id="file"]');
let formData = new FormData();
for(let i=0;i<files.length;i++){
    //将一组文件类型追加至file集合中
    //这样即可将一组文件加入FormData的同一key下,一同提交。
    formData.append("file",files[i].files[0]);
}

问题6:File API
1)File - 独立文件;提供只读信息,例如名称、文件大小、mimetype 和对文件句柄的引用。
2)FileList - File 对象的类数组序列(多文件上传)。
3)Blob - 可将文件分割为字节范围。
4)FileReader - 读取File或Blob
2)// 检测是否支持File API

if (window.File && window.FileReader && window.FileList && window.Blob) {
  //  支持
} else {
  alert('不支持');
}

问题7:FileReader就是html5为我们提供的读取文件的api。它的作用就是把文本流按指定格式读取到缓存,以供js调用。
1)FileReader有四种读取文件的方式:

2)DataURL有其固定的格式,如下:data:[文件格式];base64,[文本流base64编码]。 、举个例子: •jpg格式: data:image/jpeg;base64,/9j/4...

问题8:URL.createObjectURL(blob)
1)方法会创建一个参数中给出的对象的URL。
2)参数blob是用来创建 URL 的File对象和Blob对象。
3)oPreview.src = window.URL.createObjectURL(oFile);

console.log(window.URL.createObjectURL(oFile));
"blob:http://null.jsbin.com/2099b053-bbd4-4e46-864d-9b2b0abc09e6"

参考

详解Blob
Base64 的原理、实现及应用
FileReader以及URL.createObjectURL(blob)上传图片预览代码实现

上一篇 下一篇

猜你喜欢

热点阅读