shu*_*ltz 90 javascript arrays ajax form-data
我正在使用ajax提交包含数组,文本字段和文件的多部分表单.
我将每个VAR附加到主数据上
var attachments = document.getElementById('files');
var data= new FormData();
for (i=0; i< attachments.files.length; i++){
data.append('file', attachments.files[i]);
console.log(attachments.files[i]);
data.append ('headline', headline);
data.append ('article', article);
data.append ('arr', arr);
data.append ('tag', tag);
Run Code Online (Sandbox Code Playgroud)
然后我使用ajax函数将其发送到PHP文件以存储在sql DB中.
$.ajax({
type: "post",
url: 'php/submittionform.php',
cache: false,
processData: false,
contentType: false,
data: data,
success: function(request) {$('#box').html(request); }
})
Run Code Online (Sandbox Code Playgroud)
但在PHP方面,arr变量(即数组)显示为字符串.
当我不使用ajax作为表单数据发送它但使用简单$.POST选项时我会在PHP端将其作为数组获取,但是我也无法发送文件.
任何解决方案
Ole*_*leg 226
您也可以通过FormData这种方式发送数组:
var formData = new FormData;
var arr = ['this', 'is', 'an', 'array'];
for (var i = 0; i < arr.length; i++) {
formData.append('arr[]', arr[i]);
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以arr[]使用简单的HTML表单以与编写相同的方式编写.在PHP的情况下,它应该工作.
您可能会发现本文很有用:如何在查询字符串中传递数组?
Ric*_*Wit 72
你有几个选择:
JS
var json_arr = JSON.stringify(arr);
Run Code Online (Sandbox Code Playgroud)
PHP
$arr = json_decode($_POST['arr']);
Run Code Online (Sandbox Code Playgroud)
通过发送数组FormData.
JS
// Use <#> or any other delimiter you want
var serial_arr = arr.join("<#>");
Run Code Online (Sandbox Code Playgroud)
PHP
$arr = explode("<#>", $_POST['arr']);
Run Code Online (Sandbox Code Playgroud)
这是一个老问题,但我遇到了这个问题,最近发布了对象和文件.我需要能够发布一个对象,其子属性也是对象和数组.
下面的函数将遍历一个对象并创建正确的formData对象.
// formData - instance of FormData object
// data - object to post
function getFormData(formData, data, previousKey) {
if (data instanceof Object) {
Object.keys(data).forEach(key => {
const value = data[key];
if (value instanceof Object && !Array.isArray(value)) {
return this.getFormData(formData, value, key);
}
if (previousKey) {
key = `${previousKey}[${key}]`;
}
if (Array.isArray(value)) {
value.forEach(val => {
formData.append(`${key}[]`, val);
});
} else {
formData.append(key, value);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
这将转换以下json -
{
name: 'starwars',
year: 1977,
characters: {
good: ['luke', 'leia'],
bad: ['vader'],
},
}
Run Code Online (Sandbox Code Playgroud)
进入下面的FormData
name, starwars
year, 1977
characters[good][], luke
characters[good][], leia
characters[bad][], vader
Run Code Online (Sandbox Code Playgroud)
打字稿版本:
export class Utility {
public static convertModelToFormData(model: any, form: FormData = null, namespace = ''): FormData {
let formData = form || new FormData();
let formKey;
for (let propertyName in model) {
if (!model.hasOwnProperty(propertyName) || !model[propertyName]) continue;
let formKey = namespace ? `${namespace}[${propertyName}]` : propertyName;
if (model[propertyName] instanceof Date)
formData.append(formKey, model[propertyName].toISOString());
else if (model[propertyName] instanceof Array) {
model[propertyName].forEach((element, index) => {
const tempFormKey = `${formKey}[${index}]`;
this.convertModelToFormData(element, formData, tempFormKey);
});
}
else if (typeof model[propertyName] === 'object' && !(model[propertyName] instanceof File))
this.convertModelToFormData(model[propertyName], formData, formKey);
else
formData.append(formKey, model[propertyName].toString());
}
return formData;
}
}
Run Code Online (Sandbox Code Playgroud)
使用方法:
let formData = Utility.convertModelToFormData(model);
Run Code Online (Sandbox Code Playgroud)
将所有类型输入添加到 FormData
const formData = new FormData();
for (let key in form) {
Array.isArray(form[key])
? form[key].forEach(value => formData.append(key + '[]', value))
: formData.append(key, form[key]) ;
}
Run Code Online (Sandbox Code Playgroud)
基于@YackY 回答较短的递归版本:
function createFormData(formData, key, data) {
if (data === Object(data) || Array.isArray(data)) {
for (var i in data) {
createFormData(formData, key + '[' + i + ']', data[i]);
}
} else {
formData.append(key, data);
}
}
Run Code Online (Sandbox Code Playgroud)
使用示例:
var data = {a: '1', b: 2, c: {d: '3'}};
var formData = new FormData();
createFormData(formData, 'data', data);
Run Code Online (Sandbox Code Playgroud)
发送数据:
data[a]=1&
data[b]=2&
data[c][d]=3
Run Code Online (Sandbox Code Playgroud)
这是另一个版本,convertModelToFormData因为我需要它也能够发送文件。
实用程序.js
const Utility = {
convertModelToFormData(val, formData = new FormData, namespace = '') {
if ((typeof val !== 'undefined') && val !== null) {
if (val instanceof Date) {
formData.append(namespace, val.toISOString());
} else if (val instanceof Array) {
for (let i = 0; i < val.length; i++) {
this.convertModelToFormData(val[i], formData, namespace + '[' + i + ']');
}
} else if (typeof val === 'object' && !(val instanceof File)) {
for (let propertyName in val) {
if (val.hasOwnProperty(propertyName)) {
this.convertModelToFormData(val[propertyName], formData, namespace ? `${namespace}[${propertyName}]` : propertyName);
}
}
} else if (val instanceof File) {
formData.append(namespace, val);
} else {
formData.append(namespace, val.toString());
}
}
return formData;
}
}
export default Utility;
Run Code Online (Sandbox Code Playgroud)
我的客户端代码.js
import Utility from './utility'
...
someFunction(form_object) {
...
let formData = Utility.convertModelToFormData(form_object);
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
140387 次 |
| 最近记录: |