Node.js 实现存储服务的下载功能【包含前后端代码】

举报
liuzhen007 发表于 2021/08/10 23:12:23 2021/08/10
【摘要】 问题解决结尾 问题上传和下载功能是存储服务非常基础的功能,也是存储服务日常使用过程中最常用的功能,比如阿里云的OSS、腾讯云的COS、百度云的BOS等。当然,我们也可以自己研发私有化的对象存储服务,那么就会涉及到除了自己处理客户端逻辑外,还需要自己处理服务器的上传和下载逻辑。今天的问题就是讨论如何实现自定义的下载功能,涉及前端代码和后端代码。其实,服务器的开发语言非常丰富,常见的有 Gola...

问题

解决

结尾

问题

上传和下载功能是存储服务非常基础的功能,也是存储服务日常使用过程中最常用的功能,比如阿里云的OSS、腾讯云的COS、百度云的BOS等。当然,我们也可以自己研发私有化的对象存储服务,那么就会涉及到除了自己处理客户端逻辑外,还需要自己处理服务器的上传和下载逻辑。

今天的问题就是讨论如何实现自定义的下载功能,涉及前端代码和后端代码。其实,服务器的开发语言非常丰富,常见的有 Golang、Node.js、PHP 等。今天的这篇文章以 Node.js 语言为例进行说明。

解决

下载功能

基于 Node.js 在服务端实现下载功能,还是非常简单的,只是代码在精益求精方面,还有很多功课可以做。接下来,我们针对不同的实现方法,递进介绍。

前端代码

前端页面调用服务器的下载接口方法也非常的多,最简单的就是用 a 标签来实现,代码参考如下:

function download(href, title) {
    const a = document.createElement('a');
    a.setAttribute('href', href);
    a.setAttribute('download', title);
    a.click();
}

因为本文的重点在于介绍服务器端的处理逻辑,前端页面的下载接口调用就不过多介绍了。

后端代码

  • 方法一、

使用 download 方法实现,这种方法是最简单的,我们只需要检测到文件存在,再将文件塞到 download 接口中就行啦。

var express = require('express');
var fs=require("fs");
var app = express();

app.get("/api/download", download.single('file'), Admincontroller.getdownload);

// 下载函数一
exports.getdownload = function (req, res) {
  var id = req.query.id;
  if (id == "") {
    res.json({ success: 0, "error": "参数错误" });
    return;
  }
  // 根据 id 拼接文件名
  var des = "./public/resource/";
  var fileName = des + id + ".mp4";
  var exist = fs.existsSync(fileName);
  if (exist) {
    res.download(fileName);
  } else {
    res.json({ success: 1, "error": "目标文件不存在" });
  }

} 
  • 方法二、

使用 createReadStream 方法,该方法相较于第一种方法,稍微复杂一些,但是好处也是非常明显的,可以支持指定下载后目标文件的名字,比如服务器上的文件名称是 a.mp4,可以将下载后的文件名称保存为 b.mp4。同时,还可以保证字符统一,避免出现下载后文件名称是乱码的情况。

// 下载函数
exports.getdownload = function (req, res) {
    var id = req.query.id;
    if (id == "") {
        res.json({ success: 0, "error": "参数错误" });
        return;
    }
    // 根据 id 拼接文件名
    var des = "./public/resource/";
    var fileName = des + id + ".mp4";
    //增加中文处理
    var filenameex = filename + ".mp4"
    var realName = encodeURI(filenameex,"GBK")
    realName = realName.toString('iso8859-1')
    res.setHeader('content-Type','application/octet-stream');
    res.setHeader('content-Disposition', `attachment;filename=` + realName);
    var exist = fs.existsSync(fileurl);
    if (exist) {
        fs.createReadStream(fileurl).pipe(res);
    } else {
        res.json({
            success: 0,
            code: 1,
            "error":"目标文件不存在",
        });
    }

结尾

基于 Node.js 实现存储服务的下载功能就介绍差不多了,昨天,我们讲了上传的问题。至此,一个存储服务的上传和下载功能就介绍完了。当然,存储服务并不单单这两个功能,比较基础的功能还有查询、删除、更新等功能,这些接口API的话,相对简单,就不过多介绍了。那么,今天的内容就这么多。大家好,我是 liuzhen007,中国邦德,中国一个会敲代码的邦德,欢迎大家关注我。

日历打卡(8月更文挑战)

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。