Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>前端開發(fā)-拖拽上傳文件</title>
</head>
<body>
<script>
document.ondragover = (e) => {
e.preventDefault()
}
document.ondrop = (e) => {
e.preventDefault()
// 某些版本的 Firefox 無視 preventDefault
// 需要執(zhí)行 stopImmediatePropagation 防止瀏覽器打開文件
e.stopImmediatePropagation()
const file = e.dataTransfer.files[0]
const img = new Image()
img.src = URL.createObjectURL(file)
document.body.appendChild(img)
console.log(file)
// 如何上傳文件?
// 參見 https://www.toutiao.com/article/7298667864926536242/
}
</script>
</body>
</html>
件拖拽上傳
使用HTML5的文件API, 可以將操作系統(tǒng)中的文件拖放到瀏覽器的指定區(qū)域, 實(shí)現(xiàn)文件上傳到服務(wù)器。本文將結(jié)合實(shí)例講解HTML5+jQuery+PHP實(shí)現(xiàn)拖拽上傳圖片的過程, 來看下HTML5的魅力吧。
HTML
我們在頁面中放置一個拖拽區(qū)域#drop_area, 即接收拖拽的區(qū)域, #preview用來預(yù)覽拖拽上傳的圖片信息。
<div id="drop_area">將圖片拖拽到此區(qū)域</div>
<div id="preview"></div>
Javascript
要想實(shí)現(xiàn)拖拽, 頁面需要阻止瀏覽器默認(rèn)行為, 即四個事件(拖離、拖后放、拖進(jìn)、拖來拖去), 因?yàn)槲覀円柚篂g覽器默認(rèn)將圖片打開的行為, 這里我們使用jQuery來完成。
$(function(){
//阻止瀏覽器默認(rèn)行。
$(document).on({
dragleave:function(e){ //拖離
e.preventDefault();
},
drop:function(e){ //拖后放
e.preventDefault();
},
dragenter:function(e){ //拖進(jìn)
e.preventDefault();
},
dragover:function(e){ //拖來拖去
e.preventDefault();
}
});
...
});
接下來我們來了解下文件API。HTML5的文件API有一個FileList接口, 它可以通過e.dataTransfer.files拖拽事件傳遞的文件信息, 獲取本地文件列表信息
var fileList = e.dataTransfer.files;
在本例中, 我們用javascript來偵聽drop事件, 首先要判斷拖入的文件是否符合要求, 包括圖片類型、大小等, 然后獲取本地圖片信息, 實(shí)現(xiàn)預(yù)覽, 最后上傳。
$(function(){
/// ...接上部分
var box = document.getElementById('drop_area'); //拖拽區(qū)域
box.addEventListener("drop",function(e){
e.preventDefault(); //取消默認(rèn)瀏覽器拖拽效果
var fileList = e.dataTransfer.files; //獲取文件對象
//檢測是否是拖拽文件到頁面的操作
if(fileList.length == 0){
return false;
}
//檢測文件是不是圖片
if(fileList[0].type.indexOf('image') === -1){
alert("您拖的不是圖片!");
return false;
}
//拖拉圖片到瀏覽器,可以實(shí)現(xiàn)預(yù)覽功能
var img = window.URL.createObjectURL(fileList[0]);
var filename = fileList[0].name; //圖片名稱
var filesize = Math.floor((fileList[0].size)/1024);
if(filesize>500){
alert("上傳大小不能超過500K.");
return false;
}
var str = "<img src='"+img+"'><p>圖片名稱:"+filename+"</p><p>大小:"+filesize+"KB</p>";
$("#preview").html(str);
//上傳
xhr = new XMLHttpRequest();
xhr.open("post", "upload.php", true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
var fd = new FormData();
fd.append('mypic', fileList[0]);
xhr.send(fd);
},false);
});
我們用FormData模擬表單數(shù)據(jù), 直接將數(shù)據(jù)append到formdata對象中, 實(shí)現(xiàn)了ajax上傳。
PHP
upload.php用于接收上傳的文件信息, 完成上傳, 實(shí)現(xiàn)代碼如下:
<?php
$mypic = $_FILES["mypic"];
if(!empty($mypic)){
$picname = $_FILES['mypic']['name'];
$picsize = $_FILES['mypic']['size'];
if ($picsize > 512000) {
echo '圖片大小不能超過500k';
exit;
}
$type = strstr($picname, '.');
if ($type != ".gif" && $type != ".jpg") {
echo '圖片格式不對!';
exit;
}
$pics = 'helloweba' . $type;
//上傳路徑
$pic_path = "pics/". $pics;
move_uploaded_file($mypic["tmp_name"],$pic_path);
}
?>
下邊這幾句可以沒有
<meta charset="utf-8">
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="mypic">
<input type="submit" value="上傳">
</form>
最后總結(jié)下HTML5實(shí)現(xiàn)拖拽上傳的技術(shù)要點(diǎn):
1、監(jiān)聽拖拽:監(jiān)聽頁面元素的拖拽事件, 包括:dragenter、dragover、dragleave和drop, 一定要將dragover的默認(rèn)事件取消掉, 不然無法觸發(fā)drop事件。如需拖拽頁面里的元素, 需要給其添加屬性draggable=”true”;
2、獲取拖拽文件:在drop事件觸發(fā)后通過e.dataTransfer.files獲取拖拽文件列表, .length屬性獲取文件數(shù)量, .type屬性獲取文件類型。
3、讀取圖片數(shù)據(jù)并添加預(yù)覽圖。
4、發(fā)送圖片數(shù)據(jù):使用FormData模擬表單數(shù)據(jù)AJAX提交文件流。
TML5
拖放(Drag 和 drop)是 HTML5 標(biāo)準(zhǔn)的組成部分。
拖放的事件效果在我們的生活中經(jīng)常用到,比如我們打開電腦給別人發(fā)送一個文件或圖片,我們一般都是把文件圖片點(diǎn)擊按住然后直接拖放到我們的留言區(qū),然后直接就給發(fā)送過去了。還有就是我們在拷貝文件或圖片的時候也是,直接把文件拖進(jìn)來的,很少有用右鍵復(fù)制來拷貝的,所以,這樣的操作是不是很方便呢?那么,這樣的效果我們又怎么實(shí)現(xiàn)呢?
其實(shí),這樣的效果很簡單,今天我們就來實(shí)現(xiàn)一個簡單的圖片拖放功能,我們來看一下代碼就知道了!
新建一個index.html文件
index.html
第一,拖動什么?用ondragstart和setData()
ondragstart 屬性調(diào)用了一個函數(shù),drag(event),它規(guī)定了被拖動的數(shù)據(jù)。
第二,拖放到何處?用ondragover,ondragover 事件規(guī)定在何處放置被拖動的數(shù)據(jù)。
這要通過調(diào)用 ondragover 事件的 event.preventDefault() 方法。
第三,放置到哪里?用ondrop,當(dāng)放置被拖數(shù)據(jù)時,會發(fā)生 drop 事件。
另外新建一個demo.js文件
demo.js
demo.js
拖放效果圖
看完是不是覺得很簡單呢?
雖然,這些看似簡單的東西,但常常是在我們不經(jīng)意的時候就成了一個強(qiáng)大的酷炫的東西了。所以說,我們常看的高大上的動畫效果,其實(shí)都是這些簡單的知識堆積而成的,只要我們把基礎(chǔ)打扎實(shí)了,這些效果就慢慢地顯露出來了。
如果覺得本期內(nèi)容不錯,記得在下方給我留言!下期小編會有更好的干貨分享哦!
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。