0

    Web文件上传方法总结大全

    2023.04.17 | admin | 258次围观

    文件上传在WEB开发中应用很广泛,我们经常发微博、发微信朋友圈都用到了图片上传功能。

    文件上传是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。

    今天我给大家聊聊常见的文件(图片)上传的方式和要点处理。

    表单上传

    这是传统的form表单上传,使用form表单的input[type=”file”]控件,可以打开系统的文件选择对话框,从而达到选择文件并上传的目的可以上传flash的网站,它的好处是多浏览器兼容,它是web开发者最常用的一种文件上传方式。

    表单的代码如下:

    <form method="post" action="http://uploadUrl" enctype="multipart/form-data">
        <input name="file" type="file" accept="image/gif,image.jpg" />
        <input name="token" type="hidden" />
        <input type="submit" value="提交" /> form>

    以下是表单上传几个关键点:

    Ajax无刷新上传

    Ajax无刷新上传的方式,本质上与表单上传无异,只是把表单里的内容提出来采用ajax提交,并且由前端决定请求结果回传后的展示结果,不用像直接表单上传那样刷新和跳转页面。在这里,我们采用jQuery来作为操作DOM和创建ajax提交的js基础库。

    html代码片段如下:

    <form>
        <input id="file" name="file" type="file" />
        <input id="token" name="token" type="hidden" />form>

    javascript代码片段如下:

    $("#file").on("change", function(){
      var formData = new FormData();
      formData.append("file", $("#file")[0].files);
      formData.append("token", $("#token").val());
      $.ajax({
          url: "http://uploadUrl",
          type: "POST",
          data: formData,
          processData: false,
          contentType: false,
          success: function(response){
                  // 根据返回结果指定界面操作
          }
      });});

    我们使用了file控件的change来触发上传事件,当然你也可以使用某个按钮来触发表单提交。提交数据时可以上传flash的网站,我 用到了FormData对象来发送二进制文件,FormData构造函数提供的append()方法,除了直接添加二进制文件还可以附带一些其它的参数, 作为XMLHttpRequest实例的参数提交给服务端。

    使用jQuery提供的ajax方法来发送二进制文件,还需要附加两个参数:

    Flash上传

    很 多时候上传的需求要求显示上传进度、中断上传过程、大文件分片上传等等,这时传统的表单上传很难实现这些功能,于是产生了使用Flash上传的方式,它采 用Flash作为一个中间代理层,代替客户端跟服务端通信,此外,它也对客户端的文件选择方面拥有更多的控制权,比input[type=”file”] 要大得多。

    在这里我使用了jQuery封装好的uploadify插件来进行演示,一般这类插件都自带了上传用的Flash文件,因为跟服务端回传的数据和展示跟客户端的交互,都是Flash文件的接口跟插件来对接的。

    <div id="file_upload">div>

    html部分很简单,预留一个hook后,插件会在这个节点内部创建Flash的object,并且还附带创建了上传进度、取消控件和多文件队列展示等界面。

    $(function() {
      $("#file_upload").uploadify({
          auto: true,
          method: "Post",
          width: 120,
          height: 30,
          swf: './uploadify.swf',
          uploader: 'http://uploadUrl',
          formData: {
              token: $("#token").val()
          },
          fileObjName: "file",
          onUploadSuccess: function(file, data, response){
              // 根据返回结果指定界面操作
          }
      });});

    关于jQuery.uploadify可以访问了解:。值得注意的是flash并不适合手机端应用,更好的解决方案是使用flash+html5来解决平台的兼容性问题。

    Web文件上传方法总结大全

    截图粘贴上传

    我们发现现在有好多上传应用已经提供了截图粘贴上传功能,如WebUploader,它就支持QQ截图然后粘贴上传。

    首先,截图粘贴上传的核心思想是,监听粘贴事件,然后获取剪切板中的数据,如果是一张图片,则触发上传事件。

    代码片段如下:

    $("textarea").on("paste", function(e){
       e.stopPropagation();
       var self = this;
       var clipboardData = e.originalEvent.clipboardData;
       if (clipboardData.items.length <= 0) {
           return;
       }
       var file = clipboardData.items[0].getAsFile();
       if (!file) {
           return;
       }
       var formData = new FormData();
       formData.append("file", file);
       formData.append("token", $("#token").val());
       $.ajax({
           url: "http://uploadUrl",
           type: "POST",
           data: formData,
       }).done(function(response) {
           // 根据返回结果指定界面操作
       });
       e.preventDefault();});

    从上面代码可以看出,上传的过程都是一样的,主要是获取文件的方式。 当进行粘贴(右键paste/ctrl+v)操作时,触发剪贴板事件’paste’,从系统剪切板获取内容,而系统剪切板的数据在不同浏览器保存在不同的位置:

    拖拽上传

    拖拽上传的方式,支持的浏览器比较少,因为它用到了HTML5的两个新的属性(API)一个是Drag and Drop,一个是File API。

    上传域监听拖拽的三个事件:dragEnter、dragOver和drop,分别对应拖拽至、拖拽时和释放三个操作的处理机制,当然你也可以监听dragLeave事件。

    HTML5的File API提供了一个FileList的接口,它可以通过拖拽事件的e.dataTransfer.files来传递的文件信息,获取本地文件列表信息。

    File API在HTML5规范中只是草案,在 W3C 草案中,File 对象只包含文件名、文件类型和文件大小等只读属性。但部分浏览器在草案之外提供了一个名为 FileReader 的对象,用以读取文件内容,并且可以监控读取状态,它提供的方法有: “readAsBinaryString” ,”readAsDataURL” ,”readAsText” ,”abort” 等。

    代码片段如下:

    // dragenter$("#textarea").on("dragenter", function(e){
        e.preventDefault();});// dragover$("#textarea").on("dragover", function(e){
        e.preventDefault();});// drop$("#textarea").on("drop", function(e){
        e.stopPropagation();
        e.preventDefault();
        var files = e.originalEvent.dataTransfer.files;
        _.each(files, function(file) {
            if (!/^image*/.test(file.type)) {
              return;
            }
            var fileReader = new FileReader();
            fileReader.onload = function() {
              //uploadFile(file);
            };
            fileReader.readAsDataURL(file);
        });});

    拖拽上传过程中的几个关键点:

    拍照上传

    拍照上传可以是PC上的摄像头拍照上传也可以是手机等移动设备的拍照上传。手机上的拍照上传最常见就是我们使用微信发照片了。

    手机实现拍照上传的代码:

    <input type=file accept="image/*"><input type=file accept="video/*">

    ios 有拍照、录像、选取本地图片功能,部分android只有选取本地图片功能。

    上传与安全

    上传文件时必须做好文件的安全性,除了前端必要的验证,如文件类型、后缀、大小等验证,重要的还是要在后台做安全策略。

    这里我列举几个注意点:

    原文:

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论