我想让用户在多个阶段上传多个文件,上传后将在我的烧瓶后端进行处理。因此,我的HTML:中有一个多文件输入表单
<form action="/do-stuff" method="POST" enctype="multipart/form-data">
<label id="file-uploader-label" for="file-uploader">Upload Files</label>
<input id="file-uploader" type="file" name="file" accept="image/*" multiple="true" required>
<button id="btn-upload" type="submit">Upload</button>
</form>
我在一个表中显示所有文件(上面没有显示(,并为用户提供从文件列表中删除项目的可能性,如下所示:
let fileList = new Array;
const fileUploader = this.document.getElementById('file-uploader');
let uniqueid = 1;
fileUploader.addEventListener('change', function () {
for (let i = 0; i < fileUploader.files.length; i++) {
let currFile = fileUploader.files[i];
fileList[uniqueid] = currFile;
// Removal and display code
uniqueid++;
}
});
这给我留下了类型为"FileList"的fileList
,其中包含所有所需的文件。每当我上传file-uploader
时,它只会使用最新/最近上传的文件,而不是全部。
有了完整的列表-javascript中有没有一种方法可以附加到file-uploader
中包含的文件,或者有一种变通方法可以将数据传递到我的烧瓶后端(werkzeug.datastructures.FileStorage
类型(?
提前感谢:(
一旦您有了想要上传的文件的完整列表,您就可以从JavaScript向Flask端点发出POST
请求来存储文件。
使用最小形式的
<form id="form-files">
<input id="file-input" type="file" multiple=true />
<button type="submit">Submit</button>
</form>
您可以拦截表单提交操作并将文件发送到Flask端点。fileList
数组来自您的文件上传/删除逻辑。
var formFiles = document.getElementById('form-files');
formFiles.addEventListener('submit', function(e) {
e.preventDefault();
var formData = new FormData();
var request = new XMLHttpRequest();
for (var i = 0; i < fileList.length; i++) {
formData.append('files[]', fileList[i]);
}
request.open('POST', '/upload');
request.send(formData);
});
最后编写一个flask上传端点来处理(存储(文件。
@app.route("/upload", methods=["POST"])
def upload():
uploaded_files = request.files.getlist("file[]")
# Store files