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

如何通过AJAX在无表单数据的情况下从JS向PHP发送STL文件

解决JS通过AJAX上传STL文件到PHP保存的问题

看了你的代码,问题主要出在AJAX数据传递的方式和PHP端文件处理的逻辑上,我帮你梳理并修正了代码,同时解释关键注意点:

问题分析

  1. JS端错误:你把FormData对象嵌套到了{user:1, postdata:form_data}里,这会导致PHP无法正确解析文件数据——FormData需要直接作为AJAX的data参数传递,不能嵌套在普通对象中。
  2. PHP端错误:错误地用$_POST["file"]["name"]判断文件,文件上传的信息应该从$_FILES全局变量获取;同时缺少目录检查、上传错误判断等基础逻辑。

修正后的JS代码

Stage.prototype.handleFile = function(file) {
    this.importingMeshName = file.name;
    this.importEnabled = false;

    var model = new Model(
        this.scene,
        this.camera,
        this.container,
        this.printout,
        this.infoBox,
        this.progressBarContainer
    );
    model.isLittleEndian = this.isLittleEndian;
    model.vertexPrecision = this.vertexPrecision;
    model.import(file, this.displayMesh.bind(this));

    // 构建FormData,直接添加参数和文件
    var form_data = new FormData();
    form_data.append("user", 1); // 把user参数直接加入FormData
    form_data.append("file", file); // 直接用传入的file对象,比DOM获取更可靠

    jQuery.ajax({
        url: 'saveinjs.php',
        type: "POST",
        data: form_data, // 直接传递FormData,不要嵌套
        contentType: false,
        cache: false,
        processData: false,
        success:function(data) {
            $('#uploaded_image').html(data);
            alert(data);
            console.log(data);
        },
        error: function(xhr, textStatus, error){
            console.log(xhr.statusText);
            console.log(textStatus);
            console.log(error);
        }
    });
};

修正后的PHP代码

<?php
// 检查是否有user参数,且文件上传请求有效
if(isset($_POST['user']) && isset($_FILES['file'])){
    echo '123';

    $uploadDir = 'upload/';
    // 确保上传目录存在,不存在则创建(递归创建多级目录)
    if(!is_dir($uploadDir)){
        mkdir($uploadDir, 0755, true);
    }

    $uploadedFile = $_FILES['file'];
    // 检查文件是否上传成功(无错误)
    if($uploadedFile['error'] === UPLOAD_ERR_OK){
        $sourcePath = $uploadedFile['tmp_name'];
        // 使用basename防止路径遍历攻击,确保文件名安全
        $targetPath = $uploadDir . basename($uploadedFile['name']);

        // 尝试移动临时文件到目标目录
        if(move_uploaded_file($sourcePath, $targetPath)){
            echo "<br>文件上传成功,存储路径:" . $targetPath;
        } else {
            echo "<br>文件移动失败,请检查目录权限";
        }
    } else {
        echo "<br>文件上传出错,错误码:" . $uploadedFile['error'];
    }
}
?>

关键注意点

  • JS端:
    • 必须保持contentType: false和processData: false,这两个参数告诉jQuery不要自动处理数据和设置请求头,让浏览器生成正确的multipart/form-data编码头。
    • 直接使用传入的file对象添加到FormData,避免重复通过DOM获取,逻辑更简洁可靠。
  • PHP端:
    • 先检查$_FILES是否存在,再通过UPLOAD_ERR_OK判断上传是否成功,这是文件上传的标准检查流程。
    • 提前创建上传目录并设置合理权限(0755),避免因目录不存在导致文件移动失败。
    • 用basename()处理文件名,防止恶意用户通过构造文件名进行路径遍历攻击。

内容的提问来源于stack exchange,提问作者rashmi sm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:49:42