无刷新上传文件以及HTML5下的实现方式
admin
2023-02-11 00:20:16
0

版权声明: 本文由 一只博客 发表于 bloghome博客

文章链接: https://www.bloghome.com.cn/user/cnn237111

常规实现方法:

ajax无法实现上传文件,因此常规情况下,要实现无刷新上传文件的做法,是在页面隐藏一个iframe,然后将上传form的target指向这个iframe,变相的实现。如下代码:

Uploading...

    File: 
          


upload_target是一个长宽都是0的iframe,所以页面上看不见他。还需要配合js,使得效果更好:

其中startUpload方法是在提交表单的时候触发,而由于没有什么回调函数,因此finisheUpload只能由upload.php文件的输出控制。通常就是在输出中输出一段javascript代码来执行。

php代码如下:

window.parent.finisheUpload(0); ";
}
else
{
   echo "window.parent.finisheUpload(1); ";
}


注意,输出javascript的时候,由于调用的js方法是在iframe外定义的,要在iframe内调用js方法,需要指定window.parent。

————————

HTML5下的实现方法:

先介绍一下FileReader对象:

FileReader对象的详细说明可以在W3C官方文档中查看。

该接口提供方法来读取文件对象或者Blob对象。它继承了EventTarget,接口的描述如下:

[Constructor]
    interface FileReader: EventTarget {
      // async read methods
      void readAsArrayBuffer(Blob blob);
      void readAsText(Blob blob, optional DOMString label);
      void readAsDataURL(Blob blob);
      void abort();
      // states
      const unsigned short EMPTY = 0;
      const unsigned short LOADING = 1;
      const unsigned short DONE = 2;
      readonly attribute unsigned short readyState;
      // File or Blob data
      readonly attribute (DOMString or ArrayBuffer)? result;
      readonly attribute DOMError? error;
      // event handler attributes
      attribute EventHandler       attribute EventHandler onprogress;
      attribute EventHandler       attribute EventHandler onabort;
      attribute EventHandler onerror;
      attribute EventHandler     };


可以看到有4个异步方法,其中3个是读取,1个是放弃,4个状态属性,1个result,1个error和6个事件。(之前还有readAsBinaryString方法,不过已经被W3C去除了)这6个事件的触发时机如下:

loadstart --When the read starts.

progress --While reading (and decoding) blob

abort --When the read has been aborted. For instance, by invoking the abort() method.

error --When the read has failed (see errors).

load --When the read has successfully completed.

loadend --When the request has completed (either in success or failure).

下面演示一个例子,读取一个文本文档,并且alert出来内容。



——————————————————————————————

下面演示一个例子,读取一个DataURL的,DataURL其实是一种DataURI(要知道URI的更多细节,可以去http://css-tricks.com/data-uris/,或者维基百科了解更多)。它提供了一种在浏览器中显示数据的途径。比如你要显示一个图片(百度的logo)的话,你可以如下写:

你也可以用它的URI去写,如下:

src中填写的字符串就是DataURI,格式如下:

data:[][;charset=][;base64],

这种URI其实很有用的,可以减少HTTP请求,使得网站提速。因此获取了URI的话就可以加载本地的图像了。示例代码如下:




————————————————————————————————————

还有一个方法是readAsArrayBuffer,从字面就可以看出,是把文件读取到一个数组缓冲区。

使用readAsArrayBuffer这种方法实现上传文件

下面演示一个例子:


后端PHP代码:

try{
    $filename=$_GET['filename'];
    $input = file_get_contents("php://input");  //这个是获取请求的InputStream,PHP下的写法
    file_put_contents($filename, $input);//保存成文件。
    echo json_encode(array("msg"=>"上传成功"));
}
catch(Exception $e)
{
    echo json_encode(array("msg"=>"上传失败"));
}


FormData方法

FromData的官方说明在这里。利用FormData对象,你可以使用一系列的键值对来模拟一个完整的表单。

以下给出一个例子,允许上传多个文件:



后台PHP代码:

try
{
    foreach($_FILES as $key => $value)
    {
        //print_r ($_FILES[$key]); echo "
";         move_uploaded_file( $value["tmp_name"], $value['name']);     }         echo json_encode(array("msg"=>"上传成功")); } catch(Exception $e) {     echo json_encode(array("msg"=>"上传失败")); }



参考文档:

https://developer.mozilla.org/zh-CN/docs/DOM/XMLHttpRequest/FormData/Using_FormData_Objects

http://dev.w3.org/2006/webapi/FileAPI/#FileReader-interface

http://www.w3.org/TR/XMLHttpRequest2/#interface-formdata

http://blog.teamtreehouse.com/reading-files-using-the-html5-filereader-api

http://www.dotblogs.com.tw/junegoat/archive/2013/05/27/test-fileapi-multiupload-readasarraybuffer.aspx

相关内容

热门资讯

终于明白“同城游跑胡子有挂吗?... 您好:同城游跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款...
玩家最新攻略“科乐麻将是不是有... 您好:科乐麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款游戏...
玩家分享攻略“三鑫联盟怎么装挂... 有 亲,根据资深记者爆料三鑫联盟是可以开挂的,确实有挂(咨询软件无需打开...
【第一资讯】“微乐三打哈怎么装... 网上科普关于“微乐三打哈有没有挂”话题很是火热,小编也是针对微乐三打哈作*弊开挂的方法以及开挂对应的...
伊朗官员回应特朗普威胁:任何侵... 【环球网快讯】据法新社报道,伊朗最高领袖哈梅内伊的政治顾问阿里·沙姆哈尼当地时间周一(29日)在社交...
终于明白“掌酷十三张怎么装挂?... 网上科普关于“掌酷十三张有没有挂”话题很是火热,小编也是针对掌酷十三张作*弊开挂的方法以及开挂对应的...
今日重大消息“暗宝透视开挂器?... 今日重大消息“暗宝透视开挂器?”(果然有透视挂)您好,暗宝透视这个游戏其实有挂的,确实是有挂的,需要...
重磅消息“天蝎牛牛可以开挂吗?... 您好:天蝎牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款游戏...
今日重大发现“元来黄冈麻将到底... 有 亲,根据资深记者爆料元来黄冈麻将是可以开挂的,确实有挂(咨询软件无需...
IPO视角| 卧安机器人赴港I... 机器人这两年是越来越火,就连马斯克这样的科技大佬也重金押注机器人赛道。 在国内的机器人市场,也有越来...