带进度条的HTML5上传文件(使用XMLHttpRequest对象)

新标准的XMLHttpRequest支持上传文件,但是不支持html5的浏览器不行

html页面

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Upload Files using XMLHttpRequest - Minimal</title>

    <script type="text/javascript">
      function fileSelected() {
        var file = document.getElementById('fileToUpload').files[0];
        if (file) {
          var fileSize = 0;
          if (file.size > 1024 * 1024)
            fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
          else
            fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';

          document.getElementById('fileName').innerHTML = 'Name: ' + file.name;
          document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize;
          document.getElementById('fileType').innerHTML = 'Type: ' + file.type;
        }
      }

      function uploadFile() {
        var fd = new FormData();
        fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
        var xhr = new XMLHttpRequest();
        xhr.upload.addEventListener("progress", uploadProgress, false);
        xhr.addEventListener("load", uploadComplete, false);
        xhr.addEventListener("error", uploadFailed, false);
        xhr.addEventListener("abort", uploadCanceled, false);
        xhr.open("POST", "test2.php");
        xhr.send(fd);
      }

      function uploadProgress(evt) {
        if (evt.lengthComputable) {
          var percentComplete = Math.round(evt.loaded * 100 / evt.total);
          document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';
        }
        else {
          document.getElementById('progressNumber').innerHTML = 'unable to compute';
        }
      }

      function uploadComplete(evt) {
        /* This event is raised when the server send back a response */
        alert(evt.target.responseText);
      }

      function uploadFailed(evt) {
        alert("There was an error attempting to upload the file.");
      }

      function uploadCanceled(evt) {
        alert("The upload has been canceled by the user or the browser dropped the connection.");
      }
    </script>
</head>
<body>
<form id="form1" enctype="multipart/form-data" method="post" action="upload.php">
<div class="row">
      <label for="fileToUpload">Select a File to Upload</label>
<input type="file" name="fileToUpload" id="fileToUpload" οnchange="fileSelected();"/>
    </div>
<div id="fileName"></div>
<div id="fileSize"></div>
<div id="fileType"></div>
<div class="row">
<input type="button" οnclick="uploadFile()" value="Upload" />
    </div>
<div id="progressNumber"></div>
</form>
</body>
</html>

php文件

  
<?PHP //upload.php
	//error_reporting(E_ALL);
	header("content=text/html; charset=utf-8");
	$uf = $_FILES['fileToUpload'];
	if(!$uf){
		echo "no fileToUpload index";
		exit();
	}
	$upload_file_temp = $uf['tmp_name'];  
	$upload_file_name = $uf['name'];  
	 
	if(!$upload_file_temp){
		echo "上传失败";
		exit();
	}
	$file_size_max = 1024*1024;// 1M限制文件上传最大容量(bytes)  
	// 检查文件大小  
	if ($upload_file_size > $file_size_max) {  
		echo "对不起,你的文件容量超出允许范围:".$file_size_max;  
		exit();  
	}  
	$store_dir = "./upload/";// 上传文件的储存位置  
	$accept_overwrite = 0;//是否允许覆盖相同文件  
	$file_path = $store_dir . $upload_file_name; 
	// 检查读写文件  
	if (file_exists($file_path) && !$accept_overwrite) {  
		echo "存在相同文件名的文件";  
		exit();  
	}  
	 
	//复制文件到指定目录  
	if (!move_uploaded_file($upload_file_temp,$file_path)) {  
		echo "复制文件失败".$upload_file_temp." to ". $file_path;  
		exit;  
	}  
	 
	Echo "<p>你上传了文件:";  
	echo $upload_file_name;  
	echo "<br>";  
	//客户端机器文件的原名称。   
	 
	Echo "文件的 MIME 类型为:";  
	echo $uf['type'];  
	//文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。   
	echo "<br>";  
	 
	Echo "上传文件大小:";  
	echo $uf['size'];  
	//已上传文件的大小,单位为字节。   
	echo "<br>";  
	 
	Echo "文件上传后被临时储存为:";  
	echo $uf['tmp_name'];  
	//文件被上传后在服务端储存的临时文件名。   
	echo "<br>";  	 
	 
	$error = $uf['error'];  
	switch($error){  
	case 0:  
		Echo "上传成功"; break;  
	case 1:  
		Echo "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值."; break;  
	case 2:  
		Echo "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。";break;  
	case 3:  
		Echo "文件只有部分被上传";break;  
	case 4:  
		Echo "没有文件被上传";break;  
	}  
?> 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,下面是一个简单的示例代码: HTML 文件: ```html <form id="upload-form" enctype="multipart/form-data"> <input type="file" name="file" id="file-input"> <input type="submit" value="上传" id="submit-btn"> </form> <div id="progress"> <div id="progress-bar"></div> </div> ``` JavaScript 代码: ```javascript $(document).ready(function() { // 当表单提交时 $('#upload-form').submit(function(event) { event.preventDefault(); // 获取要上传的文件 var file_data = $('#file-input').prop('files')[0]; // 创建一个 FormData 对象 var form_data = new FormData(); form_data.append('file', file_data); // 发送 Ajax 请求 $.ajax({ url: '/upload', type: 'POST', data: form_data, dataType: 'json', processData: false, contentType: false, xhr: function() { // 创建一个 XMLHttpRequest 对象 var xhr = new XMLHttpRequest(); // 监听上传进度 xhr.upload.addEventListener('progress', function(event) { if (event.lengthComputable) { // 计算上传进度,更新进度条 var percent = Math.round((event.loaded / event.total) * 100); $('#progress-bar').css('width', percent + '%'); } }, false); return xhr; }, success: function(data) { // 上传成功,处理服务器返回的数据 console.log(data); }, error: function(xhr, status, error) { // 上传失败,处理错误信息 console.log(error); } }); }); }); ``` 上面这段代码使用 jQuery 发送 Ajax 请求,创建了一个 FormData 对象来存储要上传的文件,并且设置了一些参数: - `dataType: 'json'` 表示服务器返回的数据是 JSON 格式,jQuery 会自动解析 JSON 数据; - `processData: false` 表示不要对 FormData 对象进行处理,让浏览器处理文件上传; - `contentType: false` 表示不要设置 Content-Type 请求头,让浏览器自动设置; - `xhr: function() {...}` 表示使用 XMLHttpRequest 对象来发送 Ajax 请求,并且监听上传进度。 在监听上传进度的回调函数中,计算上传进度并更新进度条的宽度。最后处理上传成功和上传失败的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值