var fd = new FormData();
fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
var xhr = new XMLHttpRequest();
xhr.open("POST", "uph.php");
xhr.send(fd);
uph.php:
var_dump($_FILES['fileToUpload']);
这很有效,但显然只针对files[0]
。如何使这个适用于所选文件?
我尝试删除[0]
,但它无效。
答案 0 :(得分:59)
你必须得到要附加在JS中的文件长度,然后通过AJAX请求发送它,如下所示
//JavaScript
var ins = document.getElementById('fileToUpload').files.length;
for (var x = 0; x < ins; x++) {
fd.append("fileToUpload[]", document.getElementById('fileToUpload').files[x]);
}
//PHP
$count = count($_FILES['fileToUpload']['name']);
for ($i = 0; $i < $count; $i++) {
echo 'Name: '.$_FILES['fileToUpload']['name'][$i].'<br/>';
}
答案 1 :(得分:36)
使用javascript的方式:
var data = new FormData();
$.each($("input[type='file']")[0].files, function(i, file) {
data.append('file', file);
});
$.ajax({
type: 'POST',
url: '/your/url',
cache: false,
contentType: false,
processData: false,
data : data,
success: function(result){
console.log(result);
},
error: function(err){
console.log(err);
}
})
如果您多次调用data.append(&#39; file&#39;,file),您的请求将包含一系列文件。
我自己使用node.js和multipart handler中间件multer获取如下数据:
router.post('/trip/save', upload.array('file', 10), function(req, res){
// Your array of files is in req.files
}
答案 2 :(得分:18)
您只需使用fileToUpload[]
代替fileToUpload
:
fd.append("fileToUpload[]", document.getElementById('fileToUpload').files[0]);
它将返回一个包含多个名称,大小等的数组......
答案 3 :(得分:2)
在添加到fd时添加import React from 'react';
import Axios from './Axios';
class Row extends React.Component {
constructor(props){
super(props)
this.state = {
movies:[]
}
}
fetchData = async () => {
const movies = await Axios.get(this.props.fetchUrl);
this.setState(movies.data.results);
console.log(movies);
return movies;
}
componentDidMount(){
this.fetchData();
}
render() {
const {movies} = this.state
return (
<div className='row'>
<h3> {this.props.title}</h3>
<div className='row_poster'>
{
movies.map(movie =>(
<img src={movie.poster_path} alt={movie.name}/>
))
}
</div>
</div>
)
}
}
export default Row;
是可行的,但是如果您希望按文件对数据进行分组,那么我建议这样做:
[]
现在,您的数据将按文件分组发送,而不是按属性分组。
答案 4 :(得分:2)
这对我有用
var ins = $('.file').map(function () {
return this.files;
}).get();
for (var x = 0; x < ins; x++) {
formData.append("file", ins[x][0]);
}
答案 5 :(得分:1)
这很好!
var fd = new FormData();
$('input[type="file"]').on('change', function (e) {
[].forEach.call(this.files, function (file) {
fd.append('filename[]', file);
});
});
$.ajax({
url: '/url/to/post/on',
method: 'post',
data: fd,
contentType: false,
processData: false,
success: function (response) {
console.log(response)
},
error: function (err) {
console.log(err);
}
});
答案 6 :(得分:1)
我为我找到了这项工作!
var fd = new FormData();
$.each($('.modal-banner [type=file]'), function(index, file) {
fd.append('item[]', $('input[type=file]')[index].files[0]);
});
$.ajax({
type: 'POST',
url: 'your/path/',
data: fd,
dataType: 'json',
contentType: false,
processData: false,
cache: false,
success: function (response) {
console.log(response);
},
error: function(err){
console.log(err);
}
}).done(function() {
// do something....
});
return false;
答案 7 :(得分:1)
要上传带有角形数据的多个文件,请确保在component.html中有此文件。
上传文档
<div class="row">
<div class="col-md-4">
<small class="text-center"> Driver Photo</small>
<div class="form-group">
<input (change)="onFileSelected($event, 'profilepic')" type="file" class="form-control" >
</div>
</div>
<div class="col-md-4">
<small> Driver ID</small>
<div class="form-group">
<input (change)="onFileSelected($event, 'id')" type="file" class="form-control" >
</div>
</div>
<div class="col-md-4">
<small>Driving Permit</small>
<div class="form-group">
<input type="file" (change)="onFileSelected($event, 'drivingpermit')" class="form-control" />
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<small>Car Registration</small>
<div class="form-group">
<div class="input-group mb-4">
<input class="form-control"
(change)="onFileSelected($event, 'carregistration')" type="file"> <br>
</div>
</div>
</div>
<div class="col-md-6">
<small id="li"> Car Insurance</small>
<div class="form-group">
<div class="input-group mb-4">
<input class="form-control" (change)="onFileSelected($event,
'insurancedocs')" type="file">
</div>
</div>
</div>
</div>
<div style="align-items:c" class="modal-footer">
<button type="button" class="btn btn-secondary" data-
dismiss="modal">Close</button>
<button class="btn btn-primary" (click)="uploadFiles()">Upload
Files</button>
</div>
</form>
在您的componenet.ts文件中 像这样声明数组选择的文件
selectedFiles = [];
//所选文件的数组
onFileSelected(event, type) {
this.selectedFiles.push({ type, file: event.target.files[0] });
}
//在上载文件方法中,像这样附加表单数据
uploadFiles() {
const formData = new FormData();
this.selectedFiles.forEach(file => {
formData.append(file.type, file.file, file.file.name);
});
formData.append("driverid", this.driverid);
this.driverService.uploadDriverDetails(formData).subscribe(
res => {
console.log(res);
},
error => console.log(error.message)
);
}
注意:我希望此解决方案对您的朋友有用
答案 8 :(得分:1)
我的工作是这样的:
var images = document.getElementById('fileupload').files;
var formData = new FormData();
for(i=0; i<images.length; i++) {
formData.append('files', images[i]);
}
答案 9 :(得分:0)
这对我有用:
let formData = new FormData()
formData.append('files', file1)
formData.append('files', file2)
答案 10 :(得分:0)
这个为我工作
//Javascript part
//file_input is a file input id
var formData = new FormData();
var filesLength=document.getElementById('file_input').files.length;
for(var i=0;i<filesLength;i++){
formData.append("file[]", document.getElementById('file_input').files[i]);
}
$.ajax({
url: 'upload.php',
type: 'POST',
data: formData,
contentType: false,
cache: false,
processData: false,
success: function (html) {
}
});
<?php
//PHP part
$file_names = $_FILES["file"]["name"];
for ($i = 0; $i < count($file_names); $i++) {
$file_name=$file_names[$i];
$extension = end(explode(".", $file_name));
$original_file_name = pathinfo($file_name, PATHINFO_FILENAME);
$file_url = $original_file_name . "-" . date("YmdHis") . "." . $extension;
move_uploaded_file($_FILES["file"]["tmp_name"][$i], $absolute_destination . $file_url);
}
答案 11 :(得分:0)
这是此问题的 Vanilla JavaScript 解决方案-
首先,我们将使用 Array.prototype.forEach()方法,因为 document.querySelectorAll('input [type = file]')返回一个像对象数组。 然后,我们将使用 Function.prototype.call()方法将类数组对象中的每个元素分配给 this 中的 .forEach 方法。
HTML
<form id="myForm">
<input type="file" name="myFile" id="myFile_1">
<input type="file" name="myFile" id="myFile_2">
<input type="file" name="myFile" id="myFile_3">
<button type="button" onclick="saveData()">Save</button>
</form>
JavaScript
function saveData(){
var data = new FormData(document.getElementById("myForm"));
var inputs = document.querySelectorAll('input[type=file]');
Array.prototype.forEach.call(inputs[0].files, function(index){
data.append('files', index);
});
console.log(data.getAll("myFile"));
}
您可以查看同一HERE
的工作示例答案 12 :(得分:0)
创建一个FormData
对象
const formData: any = new FormData();
并附加到相同的keyName
photos.forEach((_photoInfo: { localUri: string, file: File }) => {
formData.append("file", _photoInfo.file);
});
并将其发送到服务器
// angular code
this.http.post(url, formData)
这将自动在file
下创建对象数组
如果您使用的是nodejs
const files :File[] = req.files ? req.files.file : null;
答案 13 :(得分:0)
如果您正在实例化已经将表单作为构造函数参数传递的 FormData 对象,则输入文件的名称属性必须包含方括号。
HTML:
<form id="myForm" method="POST" action="url" enctype="multipart/form-data">
<input class="form-control form-control-lg" type="file" name="photos[]" multiple />
JS:
var formData = new FormData(document.getElementById('myForm'));
console.log(formData.getAll('photos[]'));
这对我有用!
答案 14 :(得分:0)
如果我们在 html 中有输入:
<input id="my-input" type="file" mutliple /> // multiple attribute to select and upload multiple files
我们可以从输入中获取文件并使用纯 js 脚本将其发送到服务器:
const myInput = document.getElementById('my-input') // getting our input
myInput.addEventListener('change', (event) => { // listening for file uploads
const files = event.target.files // getting our files after upload
const formData = new FormData() // create formData
for (const file of files) {
formData.append('files', file) // appending every file to formdata
}
const URL = 'http://server.com:3000'
const response = fetch(URL, {
method: 'POST',
data: formData // sending our formdata in body of post request
})
return response.json()
}
它非常适合我
P.S.:我在后端使用了 multer
(node.js + express),添加到文件上传路径
upload.array("files", 10)