Node.js实现前端上传单文件&文件夹到 Linux

最近有一个需求,就是需要制作一个页面能将文件上传到Linux里。

简单分析

我这边Linux是 win10的Linux子系统
后台搭的是node后台
前端是用的简单的jq页面,比较粗糙,实现功能为主

当拿到这个需求的时候,我们拆分这个需求,发现我应该做的几步

  1. 需要写一个NodeJs的后台实现文件上传,一个前端页面并能跑通这个后台,上传到某个文件夹里
  2. 需要把这套放到Linux上并跑通

那我们就先跑通win10上的上传demo吧!

1. 搭建 node 后台

这里展示一下主要代码

  • 这里用到的 multer 需要npm install multer 下载,更加详细的 multer 可以查看我最后提供的参考资料
/* --------------------上传文件接口---------------------------- */
const multer = require('multer');

//设置跨域访问
app.all('*', function(req, res, next) {
    //设置允许跨域的域名,*代表允许任意域名跨域
    res.header("Access-Control-Allow-Origin", "*");
    //res.header("Access-Control-Allow-Credentials", "true");  
    //允许的header类型
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    //跨域允许的请求方式
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By", ' 3.2.1');
    res.header("Content-Type", "application/json;charset=utf-8");
    next();
});

let uploadFilePath = ''
const headerConfig = multer.diskStorage({
    // destination 上传目的地文件夹 (必需)
    destination: (req, file, callback) => {
        // uploadFilePath 为目录绝对路径(用户选择目录的绝对路径)
        callback(null, uploadFilePath)
    },
    // 拿到所上传文件的 filename处理,我是处理成原来的名称(可以打印出 file 的各个属性看看)
    filename: (req, file, callback) => {
        callback(null, file.originalname);
    }
})
const upload = multer({
    storage: headerConfig
})
// 上传 单个文件接口
app.post('/uploads', upload.single('file'), (req, res) => {
    res.send({"code": 1,});

})
// 上传 文件夹接口
app.post('/uploadFolder', upload.array('file', null), (req, res) => {
    res.send({"code": 1,});
})

2. Postman 测试接口

  • 也可以直接写前端页面调用这个后台接口。但是我想先用 Postman 先测通这个 node 接口。可以跑通的时候,表示我的后台接口没有出问题。再去实现前端页面,如果有什么问题就可以基本上锁定是前端页面的问题。
  • 一般测后台接口的任务,后端会测好提供的接口都是没有问题的,但是我们一个人写的话可能就会忽略这一步。

3. 前端页面实现

  • 下面是 html 的主要代码
    <!-- 这是单文件上传与文件夹上传的两个按钮 -->
    <div style="margin-bottom: 10px;">
        单文件上传:<input type="file" id='file' name="file" />
        <input type="button" value="单文件上传" onclick="uploadPic()" /> 
    </div>
    <div>
        文件夹上传:<input type="file" id='fileFolder' name="file"  webkitdirectory/>
        <input type="button" value="文件夹上传" onclick="uploadPic(1)" />
    </div>
  • 下面是 js 代码
    const uploadPic = (type) => {
        let formData = new FormData();
        let key = $('#file')[0].files
        let url = 'http://127.0.0.1:3000/uploads'
        if (type === 1) {
            // 上传文件夹
            url = 'http://127.0.0.1:3000/uploadFolder'
            key = $('#fileFolder')[0].files
        }
        // 当文件夹上传时,就把文件夹的文件依次添加进 formData
        for (var i = 0; i < key.length; i++) {
            formData.append('file', key[i]);
        }
        // 简单写个ajax 调用 
        $.ajax({
            url: url,
            data: formData,
            type: 'post',
            // 告诉jQuery不要去设置Content-Type请求头
            contentType: false,
            // 告诉jQuery不要去处理发送的数据
            processData: false,
            crossDomain: true,
            cache: false,
            success: function(res) {
                alert('上传成功');
            },
        })
    }

阶段性成功

到这里,用node upload.js 开启后台,打开刚写的html页面,依次测试上传文件。与上传文件夹都成功了,我们的第一大步也就实现了。接下来只用把这个项目迁移进 Linux 就大功告成啦!

4.Linux 上相关环境搭建

这一步我之前写过。Win10的Linux子系统中安装node环境与Linux中npm失败问题

5. 迁移上传 demo 项目

  • 我们的 node 后台 upload.js 修改一下上传目的地 destination 就可以直接放到 linux 里了
  • 因为是 win10的linux子系统关系,win10上打开页面,也是可以直接访问到 Linux里的后台,那我们前端页面里 ajax的请求url 自然也需要更新。
  • 我在Linux里 搭建了nginx这个静态web服务器,我 demo 中前端页面是直接修改 nginx 的首页,后台页面放到了 nginx首页的路径下。安装好依赖启动nginx就可以看到上传页面了,非常方便。

参考资料:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容