Nodejs 本地文件提供下载(好用)

作为测试,开发给一个apk包,不想用新手机登录QQ、微信传送文件,也不想手机连接数据线线,就想直接扫码下载。
连apk上传到蒲公英,都不想,还要蒲公英账号。
所以,自己搭一个文件扫码下载的,就可以了。

nodejs跑服务demo,代码最少了,只有5行就可以启动服务了

本机已安装:npm + nodejs + python3
(文件名是中文的,未兼容,自己改为字母吧)
只用几个文件,就可以实现了。
1、新建一个目录,目录下面有文件index.html、getfile.py、make.js、run.bat(双击就运行) + 要下载的文件

-index.html

<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src='https://cdn.staticfile.org/jquery/2.0.3/jquery.min.js'>
    </script>
    <style>
    li {
      height: 85px;
      width: 50%;
      background-color: powderblue;
    }
    </style>

    </head>
    <body>
        <p>自动加载的本地目录,点击你要下载的文件</p>
        <p>扫描二维码进入此下载页面</p>
        <img id = "img" src='/api/img'/>
  
        <p id="hidderId">
    </body>
    <script type="text/javascript">
           $.get("/api/allFiles",function(data){
                console.log(data.anArray)
                for(var i=0;i < data.anArray.length; i++){
                    li_a = "<li><a href='/api/download?file=" + data["anArray"][i] + "'>" + data["anArray"][i] + "</a></li>"
                    $("#hidderId").append(li_a)
                }
              });
    </script>
</html>

-getfile.py

# -*- coding: utf-8 -*-
import os
import sys
import io
# 解决python print 中文正常
# 到nodejs 是乱码问题
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding="utf-8")
out_str = ""
for file in os.listdir(os.getcwd()):
    if os.path.isdir(file):
        continue
    out_str += "#" + file

print(out_str)


-make.js


const http = require('http')
const fs = require('fs')
const path = require('path')
const exec = require('child_process').exec;
const url3 = require("url");
var qr = require('qr-image')
const opn = require('opn');
// 如果提示错误,缺少package.json
// 1. 初始化目录  npm init
// 2. 缺少的模块,npm install qr-image -save 
    
var port = 3000
// 修改为自动电脑ip
var host = "192.168.4.3"

const app = http.createServer((req, res)=>{
    
    const { method, url} = req
    if (method === 'GET' &&  url === '/'){
        // 读取文件
        fs.readFile(path.resolve(__dirname, 'index.html'), (err, data)=>{
            if (err){
                throw err
            }
            res.setHeader('Content-Type', 'text/html')
            res.end(data)
        })
    }
    else if (method === 'GET' &&  url === '/api/img'){
        console.log("二维吗:")
        // 返回二维码
        var img = qr.image(host + ":" + port,{size :10});
        res.writeHead(200, {'Content-Type': 'image/png'});
        img.pipe(res);
    }
    else if (method === 'GET' &&  url.includes('/api/download')){

        var query = url3.parse(url).query;
        console.log("读取参数:" + query)
        var fomrmat_lst = query.toString().split('=')
        var req_file_name = "None"
        req_file_name = fomrmat_lst[1]
        console.log("读取的文件:" + req_file_name)
        
        // 读取文件
        fs.stat(path.resolve(__dirname, req_file_name), (err, data) => {
            if (err) {
                throw err;
            }
            const filename = path.basename(path.resolve(__dirname, req_file_name));
            res.setHeader('Content-Type', 'application/*');
            dis_str = 'attachment; filename=' + req_file_name;

            res.setHeader('Content-Disposition', dis_str);
            // 无视文件大小
            const filestream = fs.createReadStream(path.resolve(__dirname, req_file_name));
            filestream.on('end', () => {
                console.log('文件读取完毕');
            });
            filestream.on('data', (chunk) => {
                console.log('reading data ...'); // 这里的 chunk 是每次读取的数据块
            });
            filestream.on('error', (err) => {
                console.error('读取文件时发生错误:', err);
            });
            filestream.pipe(res);
        })
    }else if (method === 'GET' &&  url === '/api/allFiles'){
        // 返回目录下面所有文件
        exec('python getfile.py',function(error,stdout,stderr){
            if(stdout.length >1){
       
                console.log('python 输出:',stdout);
                
                var fomrmat_lst = stdout.toString().split('#')
                res.setHeader('Content-Type', 'application/json')
                //const fileName = encodeURI('app-release.apk')
                var json = JSON.stringify({
                    anArray: fomrmat_lst,

                    });
                res.end(json)
            } else {
                console.log('you don\'t offer args');
            }
            if(error) {
                console.info('stderr : '+stderr);
            }
        })
    }
    console.log("到头了:" + req.url)
});

app.listen(port, ()=>{
    console.log('监听3000端口...')
    // 默认浏览器打开地址
    opn('http://' + host + ":" + port);
})

-run.bat

cd /d C:\Users\admin\Desktop\本地nodejs_文件下载
node make.js
pause

》》》 文件目录就上面几个文件

image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容