Javascript 使用AJAX、PHP和jQuery上传多个图像
我在使用AJAX上传多个图像时遇到了很多问题。我写这段代码: HTMLJavascript 使用AJAX、PHP和jQuery上传多个图像,javascript,jquery,ajax,file-upload,image-uploading,Javascript,Jquery,Ajax,File Upload,Image Uploading,我在使用AJAX上传多个图像时遇到了很多问题。我写这段代码: HTML <form id="upload" method="post" enctype="multipart/form-data"> <div id="drop" class="drop-area"> <div class="drop-area-label"> Drop image here </div>
<form id="upload" method="post" enctype="multipart/form-data">
<div id="drop" class="drop-area">
<div class="drop-area-label">
Drop image here
</div>
<input type="file" name="file" id="file" multiple/>
</div>
<ul class="gallery-image-list" id="uploads">
<!-- The file uploads will be shown here -->
</ul>
</form>
<div id="listTable"></div>
把图像放在这里
jQuery/AJAX
$(document).on("change", "input[name^='file']", function(e){
e.preventDefault();
var This = this,
display = $("#uploads");
// list all file data
$.each(This.files, function(i, obj){
// for each image run script asynchronous
(function(i) {
// get data from input file
var file = This.files[i],
name = file.name,
size = file.size,
type = file.type,
lastModified = file.lastModified,
lastModifiedDate = file.lastModifiedDate,
webkitRelativePath = file.webkitRelativePath,
slice = file.slice,
i = i;
// DEBUG
/*
var acc = []
$.each(file, function(index, value) {
acc.push(index + ": " + value);
});
alert(JSON.stringify(acc));
*/
$.ajax({
url:'/ajax/upload.php',
contentType: "multipart/form-data",
data:{
"image":
{
"name":name,
"size":size,
"type":type,
"lastModified":lastModified,
"lastModifiedDate":lastModifiedDate,
"webkitRelativePath":webkitRelativePath,
//"slice":slice,
}
},
type: "POST",
// Custom XMLHttpRequest
xhr: function() {
var myXhr = $.ajaxSettings.xhr();
// Check if upload property exists
if(myXhr.upload)
{
// For handling the progress of the upload
myXhr.upload.addEventListener("progress",progressHandlingFunction, false);
}
return myXhr;
},
cache: false,
success : function(data){
// load ajax data
$("#listTable").append(data);
}
});
// display progress
function progressHandlingFunction(e){
if(e.lengthComputable){
var perc = Math.round((e.loaded / e.total)*100);
perc = ( (perc >= 100) ? 100 : ( (perc <= 0) ? 0 : 0 ) );
$("#progress"+i+" > div")
.attr({"aria-valuenow":perc})
.css("width", perc+"%");
}
}
// display list of files
display.append('<li>'+name+'</li><div class="progress" id="progress'+i+'">'
+'<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">'
+'</div></div>');
})(i);
});
});
$(document).on(“更改”,“输入[name^='file']”,函数(e){
e、 预防默认值();
var This=这个,
显示=$(“#上传”);
//列出所有文件数据
$.each(This.files,function(i,obj){
//对于每个映像,异步运行脚本
(职能(一){
//从输入文件获取数据
var file=This.files[i],
name=file.name,
size=file.size,
type=file.type,
lastModified=file.lastModified,
lastModifiedDate=file.lastModifiedDate,
webkitRelativePath=file.webkitRelativePath,
slice=file.slice,
i=i;
//调试
/*
var acc=[]
$.each(文件、函数(索引、值){
acc.push(索引+”:“+值);
});
警报(JSON.stringify(acc));
*/
$.ajax({
url:“/ajax/upload.php”,
contentType:“多部分/表单数据”,
数据:{
“图像”:
{
“姓名”:姓名,
“尺寸”:尺寸,
“类型”:类型,
“lastModified”:lastModified,
“lastModifiedDate”:lastModifiedDate,
“webkitRelativePath”:webkitRelativePath,
//“切片”:切片,
}
},
类型:“POST”,
//自定义XMLHttpRequest
xhr:function(){
var myXhr=$.ajaxSettings.xhr();
//检查上载属性是否存在
if(myXhr.upload)
{
//用于处理上载的进度
myXhr.upload.addEventListener(“progress”,progressHandlingFunction,false);
}
返回myXhr;
},
cache:false,
成功:功能(数据){
//加载ajax数据
$(“#列表表”)。追加(数据);
}
});
//显示进度
函数处理函数(e){
if(如长度可计算){
var perc=数学圆整((e.loaded/e.total)*100);
perc=((perc>=100)?100:((perc尝试利用json
上传,处理文件
对象
html
js
var display=$(“#uploads”);//cache`#uploads`,this`at`$.ajax()`
var droppable=$(“#drop”)[0];//缓存`#drop`选择器
$.ajaxSetup({
上下文:显示,
contentType:“应用程序/json”,
数据类型:“json”,
发送前:函数(jqxhr,设置){
//预处理文件`
var file=JSON.parse(
decodeURIComponent(settings.data.split(/=/)[1])
);
//为每个文件添加'progress'元素`
变量进度=$(“”{
“类”:“文件-”+(!!$(“进度”).length
?$(“进度”)。长度
: "0"),
“min”:0,
“最大”:0,
“值”:0,
“数据名”:file.name
});
此.append(progress,file.name+“
”);
jqxhr.name=progress.attr(“类”);
}
});
var processFiles=函数processFiles(事件){
event.preventDefault();
//处理`input[type=file]`、`droppable``文件`
var files=event.target.files | | event.dataTransfer.files;
var images=$.map(文件,函数(文件,i){
var reader=new FileReader();
var dfd=新的$.Deferred();
reader.onload=函数(e){
resolveWith(文件[e.target.result])
};
reader.readAsDataURL(新Blob([file]{
“type”:file.type
}));
返回dfd.then(函数(数据){
返回$.ajax({
类型:“POST”,
url:“/echo/json/”,
数据:{
“文件”:JSON.stringify({
“文件”:数据,
“名字”:这个名字,
“尺寸”:这个尺寸,
“类型”:此类型
})
},
xhr:函数(){
//做“进步”活动的东西
var uploads=this.context;
var progress=this.context.find(“progress:last”);
var xhrUpload=$.ajaxSettings.xhr();
如果(xhrUpload.upload){
xhrUpload.upload.onprogress=函数(evt){
progress.attr({
“最大”:evt总计,
“值”:evt已加载
})
};
xhrUpload.upload.onloadend=函数(evt){
var progressData=进度。等式(-1);
console.log(progressData.data(“名称”)
+“上传完成…”);
var img=新图像;
$(img).addClass(progressData.eq(-1)
.attr(“类别”);
img.onload=函数(){
如果(完成此项){
console.log(
<div id="drop" class="drop-area ui-widget-header">
<div class="drop-area-label">Drop image here</div>
</div>
<br />
<form id="upload">
<input type="file" name="file" id="file" multiple="true" accepts="image/*" />
<ul class="gallery-image-list" id="uploads">
<!-- The file uploads will be shown here -->
</ul>
</form>
<div id="listTable"></div>
#uploads {
display:block;
position:relative;
}
#uploads li {
list-style:none;
}
#drop {
width: 90%;
height: 100px;
padding: 0.5em;
float: left;
margin: 10px;
border: 8px dotted grey;
}
#drop.hover {
border: 8px dotted green;
}
#drop.err {
border: 8px dotted orangered;
}
var display = $("#uploads"); // cache `#uploads`, `this` at `$.ajax()`
var droppable = $("#drop")[0]; // cache `#drop` selector
$.ajaxSetup({
context: display,
contentType: "application/json",
dataType: "json",
beforeSend: function (jqxhr, settings) {
// pre-process `file`
var file = JSON.parse(
decodeURIComponent(settings.data.split(/=/)[1])
);
// add `progress` element for each `file`
var progress = $("<progress />", {
"class": "file-" + (!!$("progress").length
? $("progress").length
: "0"),
"min": 0,
"max": 0,
"value": 0,
"data-name": file.name
});
this.append(progress, file.name + "<br />");
jqxhr.name = progress.attr("class");
}
});
var processFiles = function processFiles(event) {
event.preventDefault();
// process `input[type=file]`, `droppable` `file`
var files = event.target.files || event.dataTransfer.files;
var images = $.map(files, function (file, i) {
var reader = new FileReader();
var dfd = new $.Deferred();
reader.onload = function (e) {
dfd.resolveWith(file, [e.target.result])
};
reader.readAsDataURL(new Blob([file], {
"type": file.type
}));
return dfd.then(function (data) {
return $.ajax({
type: "POST",
url: "/echo/json/",
data: {
"file": JSON.stringify({
"file": data,
"name": this.name,
"size": this.size,
"type": this.type
})
},
xhr: function () {
// do `progress` event stuff
var uploads = this.context;
var progress = this.context.find("progress:last");
var xhrUpload = $.ajaxSettings.xhr();
if (xhrUpload.upload) {
xhrUpload.upload.onprogress = function (evt) {
progress.attr({
"max": evt.total,
"value": evt.loaded
})
};
xhrUpload.upload.onloadend = function (evt) {
var progressData = progress.eq(-1);
console.log(progressData.data("name")
+ " upload complete...");
var img = new Image;
$(img).addClass(progressData.eq(-1)
.attr("class"));
img.onload = function () {
if (this.complete) {
console.log(
progressData.data("name")
+ " preview loading..."
);
};
};
uploads.append("<br /><li>", img, "</li><br />");
};
}
return xhrUpload;
}
})
.then(function (data, textStatus, jqxhr) {
console.log(data)
this.find("img[class=" + jqxhr.name + "]")
.attr("src", data.file)
.before("<span>" + data.name + "</span><br />");
return data
}, function (jqxhr, textStatus, errorThrown) {
console.log(errorThrown);
return errorThrown
});
})
});
$.when.apply(display, images).then(function () {
var result = $.makeArray(arguments);
console.log(result.length, "uploads complete");
}, function err(jqxhr, textStatus, errorThrown) {
console.log(jqxhr, textStatus, errorThrown)
})
};
$(document)
.on("change", "input[name^=file]", processFiles);
// process `droppable` events
droppable.ondragover = function () {
$(this).addClass("hover");
return false;
};
droppable.ondragend = function () {
$(this).removeClass("hover")
return false;
};
droppable.ondrop = function (e) {
$(this).removeClass("hover");
var image = Array.prototype.slice.call(e.dataTransfer.files)
.every(function (img, i) {
return /^image/.test(img.type)
});
e.preventDefault();
// if `file`, file type `image` , process `file`
if (!!e.dataTransfer.files.length && image) {
$(this).find(".drop-area-label")
.css("color", "blue")
.html(function (i, html) {
$(this).delay(3000, "msg").queue("msg", function () {
$(this).css("color", "initial").html(html)
}).dequeue("msg");
return "File dropped, processing file upload...";
});
processFiles(e);
} else {
// if dropped `file` _not_ `image`
$(this)
.removeClass("hover")
.addClass("err")
.find(".drop-area-label")
.css("color", "darkred")
.html(function (i, html) {
$(this).delay(3000, "msg").queue("msg", function () {
$(this).css("color", "initial").html(html)
.parent("#drop").removeClass("err")
}).dequeue("msg");
return "Please drop image file...";
});
};
};
<?php
if (isset($_POST["file"])) {
// do php stuff
// call `json_encode` on `file` object
$file = json_encode($_POST["file"]);
// return `file` as `json` string
echo $file;
};