express+宝塔实现文件上传服务

news2024/11/19 1:29:36

文章目录

    • 服务器部分
      • 开启存放文件的端口
      • 配置nginx该端口入口
      • 手动在/www/wwwroot/file目录下存放一张图片进行访问
    • express接口部分
      • 代码
      • 测试

服务器部分

开启存放文件的端口

我这里以83为例
先到对应的服务商开启端口,比如我这里是阿里云
在这里插入图片描述
测试,比如这里我开启了86端口,但是没有开启87端口,效果如下
在这里插入图片描述

配置nginx该端口入口

我这里以宝塔为例
在这里插入图片描述
测试,这个时候访问ip+port可以看到如下
在这里插入图片描述

如果你使用在服务器手动修改nginx配置文件的话,可以自行百度如何开放端口

手动在/www/wwwroot/file目录下存放一张图片进行访问

比如我有一个资源是/www/wwwroot/file/1718075066607-794279070.png

那么访问ip:port/1718075066607-794279070.png即可成功访问

express接口部分

代码

我这里是routes和controller分开写的,也可以合并到一起

// routes部分

const express = require("express");
const controller = require("../controllers/upload");
const router = new express.Router();

const multer = require("multer");
const path = require("path");
const fs = require("fs");

// 设置Multer存储引擎
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    const uploadPath = path.join("/www/wwwroot/file");
    // 检查目标目录是否存在,不存在则创建
    if (!fs.existsSync(uploadPath)) {
      fs.mkdirSync(uploadPath, { recursive: true });
    }
    cb(null, uploadPath);
  },
  filename: (req, file, cb) => {
    const uniqueName =
      Date.now() +
      "-" +
      Math.round(Math.random() * 1e9) +
      path.extname(file.originalname);
    cb(null, uniqueName);
  },
});

const upload = multer({ storage: storage });

router.post("/img", upload.single("file"), controller.imgHandler);

module.exports = router;

// controller部分

const configObj = require("../common/config");

const imgHandler = (req, res) => {
  const file = req.file;

  if (!file) {
    return res.fail("上传失败!");
  }

  // 构造文件URL
  const fileUrl = `http://${configObj.host}:83/${file.filename}`;

  // 返回文件URL和成功消息
  res.success(fileUrl);
};

exports.imgHandler = imgHandler;

// app.js中进行注册

app.use("/upload", uploadRouter);

测试

访问接口ip:port/upload/img

{
    "code": 200,
    "msg": "success",
    "data": "ip:port/1717746235639-944725765.png"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1811786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

武汉凯迪正大—绝缘强度的测试设备 工频高压耐压交流试验仪 工频耐压试验机

武汉凯迪正大电气有限公司生产KDJS-8A全自动工频耐压试验系统(10kVA全自动操作台),是根据国家行业试验标准而设计的试验设备,其安全可靠、功能强、使用方便、维护简单。主要用于对各种电器产品、电气元件、绝缘材料等进行规定电压…

vue3根据按钮切换更新echarts对应的数据

效果图 初始化注意 setOption的函数定义,option是指图表的配置项和数据,notMerge是指是否不跟之前设置的 option 进行合并。默认为 false。即表示合并。如果为 true,表示所有组件都会被删除,然后根据新option 创建所有新组件 //…

如何学习Django4?看这16堂课就够了

目录 写在前面 推荐图书 内容简介 作者简介 前言/序言 改编说明 推荐理由 写在后面 写在前面 本期博主给大家推荐一本关于Python Django4的图书(2024年3月刚出版),感兴趣的小伙伴快来看看吧! 推荐图书 《Python Django…

网络安全比赛-网络安全事件响应-Server2216(解析)

B-5:网络安全事件响应 任务环境说明: 服务器场景:Server2216(开放链接) 用户名:root密码:123456 1、黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程,找出启动异常进程的脚本,并将其绝对路径作为Flag值提交; 2、黑客通过网络攻入本地服务器,…

72、AndroidStudio 导入项目Connect timed out错误解决

一、背景: 开发过程中难免会 clone 其他的项目,clone 或者下载成功之后。使用 android studio 打开项目时经常遇到 Connect timed out错误如图所示: 二、分析原因: 1、既然链接超时,肯定是 android studio 在运行…

python 魔术方法备忘录

python 魔术方法备忘录 网上收集了一些,列出了比较常用的,特别是第一张。 Python中的魔术方法(Magic Methods),也被称为特殊方法(Special Methods)或双下划线方法(Dunder Methods&a…

开放式耳机哪个品牌质量比较好?2024热门王炸品牌推荐!

开放式耳机市场繁杂,品质参差不齐。网红推荐、广告轰炸,让人眼花缭乱。但音频工程师告诉你,音质和舒适度才是关键。我根据多款开放式耳机测评结果,为大家提供选购指南,助你避开陷阱,找到心仪之选。 1、购买…

老版_zabbix安装与grafana可视化的安装(zabbix插件4.1.4)

grafana()的安装 查询、可视化和理解数据,并获取数据警报,无论数据存储在何处。在 Grafana,您可以通过美观、灵活的数据面板创建、探索和共享所有数据。 1. 网络下载安装 [itwisenode2 ]$ cd /opt/software/ #进入下载目录 #下载wegt安装命…

设计模式学习(二)工厂模式——工厂方法模式

设计模式学习(二)工厂模式——工厂方法模式 前言工厂方法模式简介示例优点缺点使用场景 前言 前一篇文章介绍了简单工厂模式,提到了简单工厂模式的缺点(违反开闭原则,扩展困难),本文要介绍的工…

地面沉降数值模拟实践技术应用与案例分析教程

原文链接:地面沉降数值模拟实践技术应用与案例分析教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247606571&idx4&sn426fd43d2f9a21e3b550c6b5da0be860&chksmfa8260cccdf5e9da7af49e796287d3756cc7052f3be17b01a0adac9c2caf2e1e6680bde…

爱普生SMD3225贴片晶振升级版TSX-3225

爱普生有一款外形尺寸3.2*2.5mm的无源贴片晶振,型号TSX-3225,也是非常直观的能从型号分辨其封装尺寸大小的,被广泛应用于便携式的无线传输设备,同时,这也是一款非常成熟的产品,毕竟SMD3225封装是目前市场主…

量产导入 | KGD 是什么?

文章目录 KGD 是什么?认识KGD定义、功能与应用实例【白话文解析】Known Good「Die」何谓良品裸晶粒 (KGD/KGD Die)?解读KGD产业应用为什么大家纷纷采用KGD? 一窥KGD与芯片封测大趋势 KGD 是什么?认识KGD定义…

AMEYA360代理品牌:ROHM开发出世界超小CMOS运算放大器,适用于智能手机和小型物联网设备等应用

全球知名半导体制造商ROHM(总部位于日本京都市)开发出一款超小型封装的CMOS运算放大器“TLR377GYZ”,该产品非常适合在智能手机和小型物联网设备等应用中放大温度、压力、流量等的传感器检测信号。 智能手机和物联网终端越来越小型化,这就要求搭载的元器…

GenAI-Arena:首个多模态生成 AI 排名开放平台

生成式 AI 指的是能够生成新内容(如图像、视频、文本等)的人工智能技术。近年来,生成式 AI 在图像和视频生成领域取得了突破性进展,例如: 艺术创作:生成式 AI 可以根据文本描述生成各种风格的艺术作品&…

汽车EDI:波森Boysen EDI项目案例

企业A作为Boysen 的供应商,为了响应Boysen的号召,需要与其实现EDI对接。由于企业A此前并没有EDI项目的实施经验,对EDI项目的实施流程、技术要求等内容不知道应该从何下手。 为了实现EDI对接意味着企业A需要具备自己的EDI系统,从而…

jdk8连接sqlserver数据库

这里写目录标题 解决方案:1.进入jdk的安装目录:2. 删除TLSv1、TLSv1.1、3DES_EDE_CBC 删除3.jdk、jre下面的security都需要删除![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d93467a91c8d47c2a4b95842e34a9ef1.png) 报错原因:The server selected protocol versi…

应急加固-网站入侵后应急流程

实验需求: bugku的在线实验平台,找到黑客入侵的方式,并确定黑客入侵的ip地址、首次webshell的密码、找到webshell并删除、找到黑客留下的后门中黑客服务器的ip及端口、删除定时任务和脚本、找到黑客添加的账号并删除、修复mysql的getshell漏…

【ARM Cache 及 MMU 系列文章 1.4 -- 如何判断 L3 Cache 是否实现】

文章目录 Cluster Configuration Register代码实现什么是Single-Threaded Core?什么是PE(Processor Execution units)?Single-Threaded Core与PE的关系对比多线程(Multithreading)Cluster Configuration Register 同 L2 Cache 判断方法类似,ARMv9 中也提供了一个自定义…

安装docker+mysql的一些坑

yum -y install docker 提示missing signature 参考这里 https://www.8a.hk/news/content/8235.html 因为docker客户端太老了 systemctl enable docker systemctl start docker systemctl status docker 显示activate基本没有问题 docker pull 总是io timeout docker pull m…

【Vue】getters

除了state之外,有时我们还需要从state中筛选出符合条件的一些数据,这些数据是依赖state的,此时会用到getters getters就类似于属性中的计算属性 这个getter只有获取,如果需要设置修改,还是需要经过mutations getters里…