ajax上传文件

先解释一下:

<form>标签添加enctype="multipart/form-data"属性。

$("form").serialize()和 new FormData($('#uploadForm')[0])都是序列化表单,实现表单的异步提交,但是二者有区别
首先,前者,只能序列化表单中的数据 ,比如文本框等input  select等的数据,但是对于文件,比如文件上传,无法实现,那么这时候,FormData就上场了,FormData 对象,可以把form中所有表单元素的name与value组成一个queryString,提交到后台。在使用Ajax提交时,使用FormData对象可以减少拼接queryString的工作量。 FormData对象,是可以使用一系列的键值对来模拟一个完整的表单
new FormData使用需要有一个注意点,
注意点一: ,对于jquery的要求是,好像是 版本1.8及其以上方可支持。
另外该对象不仅仅可以序列化文件,一样可以用作表单数据的序列化,(就是说包含了serialize()的功能);
注意点二:(js中配置)
processData:  false , contentType:  false ,缺少这二者的设置,将会出现  红色部分的错误提示,提交失败。(ajax传值的时候设置二者)

processData设置为false。因为data值是FormData对象,不需要对数据做处理。
cache设置为false,上传文件不需要缓存。
contentType设置为false。因为是由<form>表单构造的FormData对象,且已经声明了属性enctype="multipart/form-data",所以这里设置为false。

//坑点: 无论怎么传数据,console.log(formData)都会显示为空,但其实值是存在的,f12查看Net tab可以看到数据被上传了


代码:
html页面还有ajax提交数据
<!doctype html >
< html lang= "en" >
< head >
< meta charset= "UTF-8" >
< title > Document </ title >
</ head >
< body >
< form enctype= "multipart/form-data" >
< input type= "file" name= "file" >< br >< br >
< input type= "button" value= " 提交 " >
</ form >
< div class= "picDis" >
< img src= "" alt= "" >//展示以上传图片
</ div >
</ body >
</ html >
< script src= "../kao/jquery-1.9.1.min.js" type= "text/javascript" ></ script >//引入jquery文件
< script >
$ ( ' input [ type =button]' ). click ( function (){
var formData = new FormData ( $ ( 'form' )[ 0 ]) ;//获取表单序列化后的
formData . append ( 'file' , $ ( ':file' )[ 0 ]. files [ 0 ]) ;
$ . ajax ({
url : './formtest.php' ,
type : 'POST' ,
dataType : "json" ,
data : formData ,
// 这两个设置项必填
contentType : false ,
processData : false ,
success :function (data){
console . log (data) ;
if (data. msg != ' 上传失败 ' ){
// 注意这里的路径要根据自己的储存文件的路径设置
$ ( '. picDis img ' ). attr ( 'src' , './' + data. msg ) ;
} else {
alert (data. msg ) ;
}

}
})
})
</ script >

处理数据页面( formtest.php

<?php
include_once 'File.class.php' ;//引入类
$file = $_FILES ;//间数据
$obj = File :: getObj () ;//单例模式
$error = $obj -> up ( $file [ 'file' ]) ;//上传
if ( $error != false ){
$arr = [ 'msg' => $error ] ;
$arr1 = json_encode ( $arr ) ;
echo $arr1 ;
} else {
$arr = [ 'msg' => ' 上传失败 ' ] ;
$arr1 = json_encode ( $arr ) ;
echo $arr1 ;
}

File.class.php页面

<?php
header ( "content-type:text/html;charset=utf-8" ) ;
// 接口
interface up {
public function up ( $myfile ) ;
public function checkerror ( $error ) ;
public function checksize ( $size ) ;
public function checktype ( $type ) ;
public static function getObj () ;
}
final class File implements up{
public $many ;
public $arr =array ( "jpg" , "bmp" , "jpeg" , "png" , "gif" ) ;
public $error ;
private static $obj ;
private function __construct (){}
public static function getObj (){
if ( self:: $obj instanceof self ){
return self:: $obj ;
} else {
self:: $obj =new self ;
return self:: $obj ;
}
}
private function __clone (){}
function up ( $myfile ){
$this -> many = 1024 * 1024 * 2 ;
// 验证错误级别
$res1 = $this -> checkerror ( $myfile [ 'error' ]) ;
// 文件大小
$res2 = $this -> checksize ( $myfile [ 'size' ]) ;
// 验证文件类型
$res3 = $this -> checktype ( $myfile [ 'type' ]) ;
// 判断
if ( $res1 && $res2 && $res3 ){
// 文件位置
// 文件名
$dir = date ( "Y" ) . "/" . date ( "m" ) . "/" . date ( "d" ) ;
is_dir ( $dir ) or mkdir ( $dir , 0777 , true ) ;
// 图片名
$late = substr ( $myfile [ 'name' ] , strrpos ( $myfile [ 'name' ] , "." )) ;
$file_name = time () . rand ( 10000 , 99999 ) . $late ;
// 连接成路径
$path = $dir . "/" . $file_name ;
move_uploaded_file ( $myfile [ 'tmp_name' ] , $path ) ;
return $path ;
}
else {
return false ;
}
}
// 验证错误级别
function checkerror ( $error ){
if ( $error == 0 ){
return true ;
} else {
switch ( $error ){
case 1 : $this -> error = " 上传文件超过 php.ini 中的设置 " ; break ;
case 2 : $this -> error = " 上传大小超过表单中的设置 " ; break ;
case 3 : $this -> error = " 只有部分文件被上传 " ; break ;
case 4 : $this -> error = " 没有文件上传 " ; break ;
}
return false ;
}
}
// 验证上传文件大小
function checksize ( $size ){
if ( $size < $this -> many ){
return true ;
} else {
$this -> error = " 文件过大,大于 1M" ;
return false ;
}
}
// 验证类型
function checktype ( $type ){
if ( !empty ( $type )){
$style = substr ( $type , strpos ( $type , '/' ) + 1 ) ;
if ( in_array ( $style , $this -> arr )){
return true ;
} else {
$this -> error = " 文件类型不正确 不是 jpg,jpeg,bmp,png,gif" ;
return false ;
}
}
}
}
?>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值