// 引入Express框架的核心模块，用于创建Web应用、定义路由以及处理HTTP请求等相关操作
var express = require('express');
// 创建一个Express路由器实例，方便以模块化的方式来定义一组相关的路由，便于在整个应用中进行有条理的路由管理
var router = express.Router();
// 引入Node.js的path模块，主要用于处理文件路径相关的操作，例如拼接、解析文件路径等
var path = require("path");

// 引入Node.js的文件系统模块（fs），用于对文件进行读写、重命名等操作
var fs = require('fs');
// 引入Node.js的操作系统模块（os），通常可以获取操作系统相关的信息等，不过在这段代码里暂未体现其具体使用
var os = require('os');

// 引入multer模块，它是一个用于处理文件上传的中间件，能够方便地解析上传的文件数据
var multer  = require('multer');
// 创建一个multer实例，配置文件上传的临时存储目录为'tmp_uploads/'，意味着上传的文件会先临时存放在这个目录下
var upload = multer({ dest: 'tmp_uploads/' });

// 引入自定义的配置文件（config），并获取其中名为"upload_config"的配置项，这里的配置项可能包含了与文件上传相关的一些配置信息，比如文件访问的基础URL等
var upload_config = require('config').get("upload_config");

// 定义一个处理POST请求的路由，路径为根路径 "/"，该路由用于处理文件上传的业务逻辑
// 这里使用了upload.single('file')中间件，意味着它期望接收一个名为'file'的文件上传字段
router.post("/", upload.single('file'), function (req, res, next) {
    // 从上传的文件信息（req.file）中获取原始文件名，通过split方法以'.'为分隔符将文件名拆分成数组
    var fileExtArray = req.file.originalname.split(".");
    // 获取文件扩展名，即数组中的最后一个元素，例如对于文件名'test.txt'，获取到的ext就是'txt'
    var ext = fileExtArray[fileExtArray.length - 1];
    // 构建目标文件路径，先获取上传文件的临时存储路径（req.file.path），然后拼接上文件扩展名，形成最终带有正确扩展名的完整路径
    var targetPath = req.file.path + "." + ext;

    // 使用fs模块的rename方法对文件进行重命名操作，将临时存储的文件重命名为带有正确扩展名的目标文件路径
    // path.join方法用于拼接当前工作目录（process.cwd()）、文件路径相关部分，确保路径的准确性
    fs.rename(path.join(process.cwd(), "/" + req.file.path), path.join(process.cwd(), targetPath), function (err) {
        // 如果重命名文件的操作出现错误（err不为null），则返回包含错误信息的响应给客户端，状态码为400，表示请求出现错误，同时附带提示信息"上传文件失败"
        if (err) {
            return res.sendResult(null, 400, "上传文件失败");
        }
        // 如果文件重命名成功，即文件上传操作顺利完成，则返回包含相关信息的成功响应给客户端
        // 返回的数据包含了文件的临时路径（tmp_path）以及完整的访问URL（通过配置项中的基础URL和目标文件路径拼接而成），状态码为200，表示请求成功，同时附带提示信息"上传成功"
        res.sendResult({"tmp_path": targetPath, "url": upload_config.get("baseURL") + "/" + targetPath}, 200, "上传成功");
    });
});

// 将配置好的路由器对象导出，以便在主应用中可以引入并挂载到对应的路径上，使得这个文件上传的路由能够正确响应客户端发送的相应HTTP请求
module.exports = router;