HTML5与Ajax强强联手 演绎文件上传

在本文中,将介绍如何利用Ajax及HTML5异步将文件上传到服务端。php

  上传表单页面的设置web

  先来看下上传表单页面的设置,代码以下:api

<form id="upload" action="upload.php" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>HTML File Upload</legend>
<input type="hidden" id="MAX_FILE_SIZE" name="MAX_FILE_SIZE" value="300000" />
<div>
    <label for="fileselect">Files to upload:</label>
    <input type="file" id="fileselect" name="fileselect[]" multiple="multiple" />
    <div id="filedrag">or drop files here</div>
</div>
<div id="submitbutton">
    <button type="submit">Upload Files</button>
</div>
</fieldset>
</form>异步

  这里,咱们为表单的提交设置为upload.php,用来处理上传的文件,在表单中而且规定了上传的图片的大小不超过300K。ide

  上传的Javascriptfetch

  在对文件进行上传处理的Javascript中,代码以下:orm


// file selection
function FileSelectHandler(e) {
    // cancel event and hover styling
    FileDragHover(e);
    // fetch FileList object
    var files = e.target.files || e.dataTransfer.files;
    // process all File objects
    for (var i = 0, f; f = files[i]; i++) {
        ParseFile(f);
        UploadFile(f);
    }
}xml

  在上个教程中,已经对ParseFile(f)进行了介绍,如今着重看下UploadFile这个方法的代码,代码以下:对象

function UploadFile(file) {教程

  var xhr = new XMLHttpRequest();

  if (xhr.upload && file.type == "p_w_picpath/jpeg" && file.size <= $id("MAX_FILE_SIZE").value) {

  // start upload

  xhr.open("POST", $id("upload").action, true);

  xhr.setRequestHeader("X_FILENAME", file.name);

  xhr.send(file);

  }

  }

  在上面的代码中,使用了目前只有在FireFox和Chrome中才支持的XmlHttpRequest2对象,XmlHttpRequest2是对原先你们熟悉的xmlhttprequest的增强,目前还没最后定案,能够参考http://dev.w3.org/2006/webapi/XMLHttpRequest-2/的描述。在上面的代码中,首先是判断了上传文件的类型是否为图片文件以及大小是否符合要求,若是符合要求的话,则调用send方法发送文件到服务端,而且这里设置了HTTP文件头X_FILENAME为上传的文件名。

  在PHP服务端的代码中,首先经过HTTP头来判断是否经过AJAX上传仍是普通的表单上传。

 $fn = (isset($_SERVER['HTTP_X_FILENAME']) ? $_SERVER['HTTP_X_FILENAME'] : false);

  if ($fn) {

  // AJAX调用

  file_put_contents(

  'uploads/' . $fn,

  file_get_contents('php://input')

  );

  echo "$fn uploaded";

  exit();

  }

  若是$fn中设置了值,则调用使用file_put_contents方法,将文件复制到uploads文件夹,而若是是经过普通表单的上传,则做以下判断:  

相关文章
相关标签/搜索