如何将id与FormData传入AJAX供upload.php使用,传参失败该如何修复
问题原因
你当前的传参方式和FormData的AJAX传输规则冲突:你配置了contentType: false和processData: false,这两个参数是专门用于直接传输FormData对象的,如果你把id和FormData封装进普通对象再传输,jQuery不会对内容做序列化处理,后端无法正常解析参数,自然拿不到id和文件数据。
修正方案
1. 把id追加到FormData对象中
不需要单独把id放在外层,直接把id作为普通字段追加到你已经创建的FormData实例里即可,同时记得把选中的文件也追加到FormData中:
var id = "<?php echo $id ?>"; var error_images = ''; var form_data = new FormData(); var files = $('#multiple_files')[0].files; if(files.length > 15) { error_images += 'You can not select more than 15 files'; } else { // 追加id参数 form_data.append('id', id); // 追加选中的文件 for(let i = 0; i < files.length; i++) { form_data.append('files[]', files[i]); } }
2. 调整AJAX传参
AJAX的data字段直接传入FormData实例即可,不需要额外封装成对象:
$.ajax({ url:"upload.php", data: form_data, // 直接传FormData对象 method:"POST", contentType: false, cache: false, processData: false, beforeSend:function(){ $('#error_multiple_files').html('<br /><label class="text-primary">Uploading...</label>'); }, success:function(data) { $('#error_multiple_files').html('<br /><label class="text-success">Uploaded</label>'); load_image_data(); } });
3. 后端安全优化(可选但强烈建议)
你当前的SQL拼接方式存在SQL注入风险,建议改用预处理语句写入数据:
// 先对id做类型转换避免恶意传参 $id = intval($_POST['id']); // 假设$conn是你的数据库连接实例 $stmt = $conn->prepare("INSERT INTO tbl_image (postid, image_name, image_description) VALUES (?, ?, '')"); // i对应int类型,s对应string类型 $stmt->bind_param("is", $id, $file_name); $stmt->execute();
调整后后端$_POST['id']就可以正常拿到参数,文件也可以通过$_FILES['files']获取。
内容的提问来源于stack exchange,提问作者Rafiqul Islam
相关产品推荐
相关产品推荐

