Flask API无法识别文件夹输入,音频批量转录功能异常排查
问题分析与解决方案
核心问题根源
- 后端逻辑错误:你错误地认为前端会传递名为
folder的表单字段,但实际上开启webkitdirectory后,浏览器会把文件夹内的所有文件作为多文件上传,不会发送文件夹路径到request.form,导致后端永远进入不了文件夹处理分支。 - 多文件处理缺失:上传文件夹时,
request.files['file']只会获取到第一个文件,后续文件被直接忽略,这就是只处理第一个文件的原因。 - 服务器路径误解:后端试图用
os.listdir(folder)访问服务器本地文件夹,但上传的文件是浏览器提交的文件对象,服务器根本没有这个文件夹路径。
解决方案
后端代码修正
修改Flask路由,直接处理多文件上传(兼容单文件和文件夹上传场景):
@app.route('/transcriber', methods=['GET', 'POST']) def transcriber(): if request.method == 'GET': return render_template('jobs_transcriber.html', queued_jobs=jm.queued_jobs, running_jobs=jm.running_jobs, completed_jobs=jm.completed_jobs, max_running_jobs=jm.max_running_jobs, allowed_files=app.config['ALLOWED_FILES_TRANSCRIBER']) if request.method == 'POST': if 'file' not in request.files: flash('Missing file part') return redirect(request.url) # 获取所有上传的文件(单文件/文件夹内多文件通用) uploaded_files = request.files.getlist('file') valid_files = [] for file in uploaded_files: if file.filename == '': flash('Empty file detected, skipping') continue if not is_allowed_file(app.config['ALLOWED_FILES_TRANSCRIBER'], file.filename): flash(f'File {file.filename} is not an allowed file type') continue valid_files.append(file) if not valid_files: flash('No valid files to process') return redirect(request.url) # 传入文件列表到任务创建逻辑 jm.create_job_transcriber(valid_files) return redirect(request.url)
关键修改点
- 移除了无效的
folder字段判断逻辑,因为前端不会传递该字段。 - 使用
request.files.getlist('file')替代request.files['file'],获取所有上传的文件。 - 统一处理单文件和多文件场景,过滤无效文件后批量提交任务。
- 确保
jm.create_job_transcriber方法支持接收文件列表(如果原方法仅支持单个文件,需同步修改该方法的批量处理逻辑)。
前端代码优化(可选)
原前端逻辑基本正常,可补充兼容更多浏览器的字段设置:
document.getElementById('source_type').addEventListener('change', function() { var selected_value = this.value; var upload_label = document.getElementById('upload_label'); var upload_input = document.getElementById('upload_input'); if (selected_value === 'folder') { upload_label.innerText = 'Select a folder:'; upload_input.setAttribute('webkitdirectory', ''); upload_input.setAttribute('directory', ''); // 兼容非webkit内核浏览器 upload_input.setAttribute('multiple', 'true'); } else { upload_label.innerText = 'Upload a file:'; upload_input.removeAttribute('webkitdirectory'); upload_input.removeAttribute('directory'); upload_input.removeAttribute('multiple'); } });
内容的提问来源于stack exchange,提问作者Federicofkt
相关产品推荐
相关产品推荐

