Node.js Express服务运行PHP上传脚本遇404及脚本直接下载问题求助
问题根本原因
- Express 本身没有内置PHP运行环境,放在public目录下的PHP文件只会被当成普通静态资源返回,所以直接访问时浏览器会触发下载,不会执行PHP代码逻辑。
express.static中间件默认仅处理GET和HEAD类型的请求,你前端发的是POST请求到/upload.php,没有配置对应的POST路由,所以直接返回404错误。- 你的PHP代码本身存在语法错误:
$_FILES["inputImg"]["names"]的键名错误,正确为单数name。
推荐解决方案:直接用Express实现上传逻辑(无需PHP)
不需要额外安装PHP环境,改起来最简单:
- 先安装文件上传依赖
npm install multer
- 修改
server.js代码,修正原有错误,添加上传逻辑:
const express = require("express"); const https = require("https"); const path = require("path"); const fs = require("fs"); const ip = require("ip"); const multer = require("multer"); // 引入上传中间件 var app = express(); const CWD = __dirname; var clientIp; var port = 443; // 配置文件上传规则 const storage = multer.diskStorage({ destination: function (req, file, cb) { // 自动创建uploads目录 const uploadDir = path.join(CWD, "uploads"); if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir, { recursive: true }); } cb(null, uploadDir); }, filename: function (req, file, cb) { cb(null, file.originalname); // 保留原始文件名 } }); const upload = multer({ storage: storage }); function getIp(req, res, next) { clientIp = req.ip; console.log("ip:" + clientIp); next(); } app.use(getIp); app.use(express.static(path.join(CWD, "public"))); // 修正静态资源路径写法 // 处理上传请求,替代原upload.php功能 app.post("/upload.php", upload.single("inputImg"), function (req, res) { res.sendStatus(200); }); // https配置保留不变 var sslServer = https.createServer( { key: fs.readFileSync(path.join(CWD, "certificate", "key.pem")), cert: fs.readFileSync(path.join(CWD, "certificate", "certificate.pem")), }, app ); sslServer.listen(port, function () { console.log("listening on " + port); console.log("CTRL + C to exit server"); });
- 可以直接删除
upload.php文件,不需要了,前端代码不用做任何修改即可正常运行。
如果你一定要保留PHP实现
需要做以下修改:
- 安装本地PHP运行环境
- 给Express安装
php-express中间件,配置PHP解析规则 - 新增
POST /upload.php路由,将请求交给PHP中间件处理 - 修正PHP代码里的
$_FILES["inputImg"]["names"]为$_FILES["inputImg"]["name"] - 给uploads目录配置PHP写入权限
内容的提问来源于stack exchange,提问作者david b
相关产品推荐
相关产品推荐

