Javascript 通过AJAX发送图像的问题
我创建了一个on-submit函数,如果用户上传了不同的数据和图像,它会捕获不同的数据,并将图像绑定到Javascript 通过AJAX发送图像的问题,javascript,jquery,ajax,Javascript,Jquery,Ajax,我创建了一个on-submit函数,如果用户上传了不同的数据和图像,它会捕获不同的数据,并将图像绑定到FormDatatype对象中。然后将其与其他数据一起发送到服务器进行上载。我的问题是,我似乎很难将图像与其他变量一起发送到服务器。我在success上得到的只是一个空白的回答 以下是我正在做的: ElevationColorsForm.prototype.submit = function() { // DEFUALT SET FORMDATA TO FALSE var for
FormData
type对象中。然后将其与其他数据一起发送到服务器进行上载。我的问题是,我似乎很难将图像与其他变量一起发送到服务器。我在success
上得到的只是一个空白的回答
以下是我正在做的:
ElevationColorsForm.prototype.submit = function()
{
// DEFUALT SET FORMDATA TO FALSE
var formdata = false;
// MAKE SURE BROWSER SUPPORTS FORM DATA
if (window.FormData) {
formdata = new FormData();
}
/************ DATA IS SENT TO SERVER TO BE STORED ON SAVE CHANGES *****************/
var color_name = '';//<!-- CONTAIN NAME OF COLOR SET IN INPUT FIELD
var color_file = '';//<!-- CONTAIN THE IMAGE TO BE UPLOADED // MOVED OVER TO THE formdata
var color_type = [];//<!-- EITHER new_color OR current_color
color_name = $(".color-item-input").map(function()
{
return this.value
}).get().join(", ");
color_file = $(".color-item-file").each(function()
{
if(this.files.length > 0)
{
if (!!this.files[0].type.match(/image.*/)) {
var file = this.files[0];
var reader;
if ( window.FileReader ) {
reader = new FileReader();
reader.readAsDataURL(file);
}
if (formdata) {
formdata.append("images[]", file);
}
return file;
}
else
{
formdata.append("images[]", 'none');
return 'false';
}
}
else
{
formdata.append("images[]", 'none');
return 'false';
}
}).get();
$(".color-item").each(function()
{
if($(this).hasClass('current-color'))
{
color_type.push('current-color');
}
else if($(this).hasClass('new_color'))
{
color_type.push('new-color');
}
});
var RestrictionSelectActive = $(".restriction_active_ability option:selected").each(function()
{
return this.value
}).get();
var thisOne = this.Elevation.data.ifpe_id; // <!-- ELEVATION ID
$.ajax({
url: "actions/save_elevation_colors.php",
type: "post",
data:
{
'formData' : formdata,
'elevation_id' : thisOne
},
processData: false,
contentType: false,
success: function(data){
console.log(data);
$(".message_box").text("Changes made!");
$(".message_box").fadeIn();
setTimeout(function(){
$(".message_box").fadeOut();
$(".message_box").empty();
},2000);
},
error:function(){
alert("failure");
}
});
}
ElevationColorsForm.prototype.submit=function()
{
//取消将FORMDATA设置为FALSE
var formdata=false;
//确保浏览器支持表单数据
if(window.FormData){
formdata=新的formdata();
}
/************数据被发送到服务器以存储在保存更改上*****************/
var color_name='';//您不能将FormData
对象作为属性添加到data
对象中。您只能单独发送一个FormData
对象,该对象将被适当编码。如果您传递一个键值对象,jQuery将尝试对其进行www-form-urlencode编码。另请参阅
那FileReader
应该在那里做什么?@Bergi我看得越多,我就越不知道了。我可以解码它并用它发送过来,然后用PHP重新编码吗?没有理由这么做,FormData
为你做。我确信不支持FormData
的浏览器不支持FileReader
也可以。我的解决方案是什么?我需要同时发送更多数据。只需将所有数据附加到formdata
对象,因此每当我需要发送数据时,只需将其附加到formdata
出于好奇,您知道为什么我们必须将processData
和contentType
设置为false吗?processData
被设置为false
,因为数据
是某种对象,jQuery将尝试枚举其属性并将其作为URL参数进行URL编码。它需要直接将formdata
传递到XHR。send()
方法。contentType
设置为false
,这将中断请求。
ElevationColorsForm.prototype.submit = function() {
if (!window.FormData) {
alert("Sorry, your browser does not support uploading files with Ajax.");
throw new Error("no FormData support");
}
function getValue() { return this.value; }
var formdata = new FormData();
var color_name = $(".color-item-input").map(getValue).get().join(", ");
var RestrictionSelectActive = $(".restriction_active_ability option:selected").map(getValue).get();
var color_type = $(".color-item").map(function() {
if ($(this).hasClass('current-color'))
return 'current-color';
if ($(this).hasClass('new_color'))
return 'new-color';
return '';
}).get();
$(".color-item-file").each(function() {
if(this.files.length > 0 && /image.*/.test(this.files[0].type)) {
formdata.append("images[]", this.files[0]);
} else {
formdata.append("images[]", 'none');
}
});
formdata.append('elevation_id', this.Elevation.data.ifpe_id);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
$.ajax({
url: "actions/save_elevation_colors.php",
type: "post",
data: formdata,
// ^^^^^^^^
processData: false,
contentType: false
}).then(function(data){
console.log(data);
$(".message_box").text("Changes made!");
$(".message_box").fadeIn();
setTimeout(function(){
$(".message_box").fadeOut();
$(".message_box").empty();
},2000);
}, function(){
alert("failure");
});
}