如何通过AJAX在无表单数据的情况下从JS向PHP发送STL文件
解决JS通过AJAX上传STL文件到PHP保存的问题
看了你的代码,问题主要出在AJAX数据传递的方式和PHP端文件处理的逻辑上,我帮你梳理并修正了代码,同时解释关键注意点:
问题分析
- JS端错误:你把
FormData对象嵌套到了{user:1, postdata:form_data}里,这会导致PHP无法正确解析文件数据——FormData需要直接作为AJAX的data参数传递,不能嵌套在普通对象中。 - 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
相关产品推荐
相关产品推荐

