You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask项目中JS表单上传PDF文件在iPhone/Windows设备上失败的问题求助

Flask项目中JS表单上传PDF文件在iPhone/Windows设备上失败的问题求助

我正在写一个小型Flask程序,功能是让用户通过前端的HTML/JS表单上传PDF文件,后端统一处理这些文件。我在Ubuntu和Android(Firefox浏览器)上测试完全没问题,但找了两个用户测试后发现上传失败——一个用的是iPhone,另一个是Windows设备。

前端代码片段

<form id="bundleForm" action="/create_bundle" method="POST" enctype="multipart/form-data">
    <div class="card">
            <div class="card-header">
                <div class="card-icon">
                    <i class="mdi mdi-file-multiple"></i>
                </div>
                <h2 class="card-title">Add PDFs</h2>
            </div>
            <div id="dropZone" class="upload-zone">
                <i class="mdi mdi-upload upload-icon" style="color: #d57782;"></i>
                <p><span style="color: #d57782; font-size: 1.2rem;"><b>Upload your PDFs here:</b> Click to select, or drag and drop</p></span>
                <input type="file" id="fileInput" name="files" multiple accept=".pdf" style="display: none;">
                <div class="progress-container">
                    <div class="progress-bar"></div>
                </div>
            </div>
      </div>

后端上传处理代码片段

def save_uploaded_file(file, directory, filename=None):
    app.logger.debug(f"[{session_id}-{timestamp}-APP]-- save_uploaded_files activated for {file}")
    if file and file.filename:
        filename = filename or file.filename
        filename = secure_filename(filename)
        filepath = os.path.join(directory, filename)
        file.save(filepath)
        return filepath
    return None

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/create', methods=['GET', 'POST'])
def create():
    if request.method == 'GET':
        return render_template('index.html')

    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    session_id = str(uuid.uuid4())[:8]
    try:
        # Create temporary working directory in ./tempfiles/{timestamp}:
        if not os.path.exists('tempfiles'):
            os.makedirs('tempfiles')
        temp_dir = os.path.join('tempfiles', session_id)
        os.makedirs(temp_dir)
        app.logger.debug(f"[{session_id}-{timestamp}-APP]-- Temporary directory created: {temp_dir}")
        
        # Save uploaded files
        app.logger.debug(f"[{session_id}-{timestamp}-APP]-- ******************Gathering uploads******************")
        files = secure_filename(request.files.getlist('files'))
        input_files = []
        for file in files:
            if file.filename:
                filepath = save_uploaded_file(file, temp_dir)
                if filepath:
                    input_files.append(filepath)
        app.logger.debug(f"[{session_id}-{timestamp}-APP]-- Number of input_files: {len(input_files)}")

# ... 后续代码省略

服务部署及其他信息

这个应用用Waitress默认配置部署,测试环境没有设置任何文件大小限制,也没修改默认超时时间。

我觉得不是权限问题,因为成功和失败的测试都是在同一个实例上跑的;也不像是文件名的问题,因为已经做了文件名清洗。

我加了调试日志试图定位问题,但没找到原因。我自己在Android和Ubuntu上,不管是本地网络还是远程访问,换不同浏览器测试都能正常复现成功场景——日志里会显示正确的文件数量,比如Number of input_files: 3。但其他用户的测试日志里,这个值是Number of input_files: 0。

还有一个用户反馈,上传时似乎会忽略第一个文件,不过有时候剩下的文件能正常处理。

我查了Stack Overflow上的其他相关回答,试了一些调整但都没用,也没法解释为什么问题只出现在特定设备上。这是我第一次用JavaScript和Flask开发,完全不知道从哪里入手排查了。


备注:内容来源于stack exchange,提问作者Tris Sherliker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:48:02