拖拽上传图片(只能上传单张)

upload.html:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		a{
			cursor: pointer;
		}
		.d1{
			width: 80%;
			height: 200px;
			background: #ddd;
		}
		#d1_content{
			width: 75%;
			height: 200px;
		}
		#a_upload{

		}
	</style>
</head>
<body>
	<div class="d1">
		<div id="d1_content"></div>
	</div>
	<input type="file" name="mypic" style="display:none;">
	<a id="a_upload">上传</a>
	
	<script src="js/jquery.min.js"></script>
	<script src="js/ajax.js"></script>
	<script>
		//拖动上传图片
		function getId(id){
			return document.getElementById(id);
		}
		$(document).on({
			dragenter:function(e){e.preventDefault()},
			dragover:function(e){e.preventDefault()},
			dragleave:function(e){e.preventDefault()},
			drop:function(e){e.preventDefault()},
		});
		var drop_area=getId("d1_content");
		//ondrop 事件在可拖动元素或选取的文本放置在目标区域时触发。
		var fd=null;
		drop_area.οndrοp=function(e){
			e.preventDefault();
			var fileInfo=e.dataTransfer.files;        

			var size=Math.ceil(fileInfo[0].size/1024);
			if(size>2048){
				alert("上传图片太大,不能超过2MB");
				return;
			}

			var type=fileInfo[0].type.indexOf("image");
			if(type==-1){
				alert("只能上传图片格式的文件");
				return;
			}

			var img=window.URL.createObjectURL(fileInfo[0]);
			var html=`<img src="${img}" />`;
			$("#d1_content").html(html);

			fd=new FormData();
			fd.append("mypic",fileInfo[0]);
		}

		a_upload.οnclick=function(e){
			e.preventDefault();
			var xhr = new XMLHttpRequest();
		    xhr.onreadystatechange = function(){
		      console.log(xhr.responseText);
		    }
		    xhr.open("POST","upload.php",true);
		    xhr.setRequestHeader("X-Requested-With",
		      "XMLHttpRequest");
		    xhr.send(fd);
		}

	</script>
</body>
</html>

注:需要引入JQ。

ajax.js:

//封装适合各种情况的简化版ajax函数
function ajax({//利用解构,获取将来参数对象中每个属性值
  type,//请求类型: "get"||"post"
  url,//请求的url地址: "xxx.php"
  data,//请求携带的参数: "变量1=值&..."
  dataType,//服务器端返回值类型: "json"||"text"
}){
  //服务器端返回值类型默认为text
  dataType=dataType||"text";
  //只要远程请求,必有延迟,只要延迟,比用promise等待完成后,才执行后续操作
  return new Promise(function(resolve){//.then()
    //AJAX 4步/5步:
    var xhr=new XMLHttpRequest();//1.获得xhr对象
    //如果是get请求,且传入了data参数,才需要拼接url和data为get请求的完整地址
    if(type.toLowerCase()=="get"&&data!==undefined)
      url+="?"+data;
    xhr.open(type,url,true);//2. 建立连接
    //3. 设置请求状态回调函数
    xhr.onreadystatechange=function(){
      //如果请求完成,且成功!
      if(xhr.readyState==4&&xhr.status==200){
        //如果服务器端响应类型不是json,则调用后续resolve操作,并传入原始responseText,做后续处理
        if(dataType.toLowerCase()!="json")
          resolve(xhr.responseText);
        else//如果服务器端响应类型是json,则自动调用JSON.parse转为js对象,再交给resolve函数做后续处理
          resolve(JSON.parse(xhr.responseText));
      }
    }
    //只有type为post,才需要设置请求头
    if(type.toLowerCase()=="post")
      xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    //只有type为post,才需要send时,传入参数
    xhr.send(type.toLowerCase()=="post"?data:null);
  })
}


init.php:

<?php 

	$conn=mysqli_connect('127.0.0.1','root','','upload',3306);      
	mysqli_query($conn,"SET NAMES UTF8");
?>

upload.php:

<?php 

	require("init.php");

	$rs=empty($_FILES);
	if($rs){
		echo '{"code":-1,"msg":"没有上传文件"}';
		exit;
	}

	$picname=$_FILES["mypic"]["name"];
	$picsize=$_FILES["mypic"]["size"]/1000;
	$type=strtolower(strstr($picname,"."));
	if($type!=".jpg"&&$type!=".gif"&&$type!=".png"){
		echo '{"code":-2,"msg":"上传文件类型错误"}';
		exit;
	}
	if($picsize>2048){
		echo '{"code":-3,"msg":"上传文件过大,不能超过2MB"}';
		exit;
	}

	$filename=time().rand(1,9999).$type;
	$src=$_FILES["mypic"]["tmp_name"];
	$des="uploads/".$filename;
	move_uploaded_file($src,$des);

	$sql="INSERT INTO upload_img(path) VALUES('$des')";
	$result=mysqli_query($conn,$sql);
	if($result)
		echo '{"code":1,"msg":"上传成功"}';
?>

注:最好不要上传很大的图片,因为post上传有限制。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值