返回顶部
首页 > 资讯 > 前端开发 > node.js >怎么实现图片上传写入磁盘的接口
  • 406
分享到

怎么实现图片上传写入磁盘的接口

2024-04-02 19:04:59 406人浏览 独家记忆
摘要

本篇内容主要讲解“怎么实现图片上传写入磁盘的接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现图片上传写入磁盘的接口”吧! 一:开启 Node

本篇内容主要讲解“怎么实现图片上传写入磁盘的接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现图片上传写入磁盘的接口”吧!

 

一:开启 Node.js 服务

开启一个 node.js 服务,指定路由 /upload/image 收到请求后调用 uploadImageHandler 方法,传入 Request  对象。

const Http = require('http'); const fORMidable = require('formidable'); const fs = require('fs'); const fsPromises = fs.promises; const path = require('path'); const PORT = process.env.PORT || 3000; const server = http.createServer(async (req, res) => {   if (req.url === '/upload/image' &&  req.method.toLocaleLowerCase() === 'post') {     uploadImageHandler(req, res);   } else {    res.setHeader('statusCode', 404);    res.end('Not found!')   } }); server.listen(PORT, () => {   console.log(`server is listening at ${server.address().port}`); });

二:处理图片对象

formidable 是一个用来处理上传文件、图片等数据的 NPM 模块,form.parse 是一个 callback 转化为 Promise  便于处理。

Tips:拼接路径时使用 path 模块的 join 方法,它会将我们传入的多个路径参数拼接起来,因为 linuxwindows  等不同的系统使用的符号是不同的,该方法会根据系统自行转换处理。

const uploadImageHandler = async (req, res) => {   const form = new formidable.IncomingForm({ multiples: true });     form.encoding = 'utf-8';     form.maxFieldsSize = 1024 * 5;     form.keepExtensions = true;    try {     const { file } = await new Promise((resolve, reject) => {         form.parse(req, (err, fields, file) => {           if (err) {             return reject(err);           }           return resolve({ fields, file });         });       });     const { name: filename, path: sourcePath } = file.img;     const destPath = path.join(__dirname, filename);     console.log(`sourcePath: ${sourcePath}. destPath: ${destPath}`);     await mv(sourcePath, destPath);     console.log(`File ${filename} write success.`);     res.writeHead(200, { 'Content-Type': 'application/JSON' });     res.end(jsON.stringify({ code: 'SUCCESS', message: `Upload success.`}));   } catch (err) {     console.error(`Move file failed with message: ${err.message}`);     res.writeHead(200, { 'Content-Type': 'application/json' });     res.end(JSON.stringify({ code: 'ERROR', message: `${err.message}`}));   } }

三:实现 mv 方法

fs.rename 重命名文件

将上传的图片写入本地目标路径一种简单的方法是使用 fs 模块的 rename(sourcePath, destPath) 方法,该方法会异步的对  sourcePath 文件做重命名操作,使用如下所示:

const mv = async (sourcePath, destPath) => {  return fsPromises.rename(sourcePath, destPath); };

cross-device link not permitted

在使用 fs.rename() 时还要注意 cross-device link not permitted 错误,参考 rename(2) — Linux  manual page:

**EXDEV **oldpath and newpath are not on the same mounted filesystem. (Linux  permits a filesystem to be mounted at multiple points, but rename() does not  work across different mount points, even if the same filesystem is mounted on  both.)

oldPath 和 newPath 不在同一挂载的文件系统上。(Linux 允许一个文件系统挂载到多个点,但是 rename()  无法跨不同的挂载点进行工作,即使相同的文件系统被挂载在两个挂载点上。)

在 Windows 系统同样会遇到此问题,参考  http://errorco.de/win32/winerror-h/error_not_same_device/0x80070011/

winerror.h 0x80070011 #define ERROR_NOT_SAME_DEVICE The system cannot move  the file to a different disk drive.(系统无法移动文件到不同的磁盘驱动器。)

此处在 Windows 做下复现,因为在使用 formidable  上传文件时默认的目录是操作系统的默认目录 os.tmpdir(),在我的电脑上对应的是 C 盘下,当我使用 fs.rename() 将其重名为 F  盘时,就出现了以下报错:

C:\Users\ADMINI~1\AppData\Local\Temp\upload_3cc33e9403930347b89ea47e4045b940 F:\study\test\202366 [Error: EXDEV: cross-device link not permitted, rename 'C:\Users\ADMINI~1\AppData\Local\Temp\upload_3cc33e9403930347b89ea47e4045b940' -> 'F:\study\test\202366'] {   errno: -4037,   code: 'EXDEV',   syscall: 'rename',   path: 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\upload_3cc33e9403930347b89ea47e4045b940',   dest: 'F:\\study\\test\\202366' }

设置源路径与目标路径在同一磁盘分区

设置上传文件中间件的临时路径为最终写入文件的磁盘分区,例如我们在 Windows 测试时将图片保存在 F 盘下,所以设置 formidable 的  form 对象的 uploadDir 属性为 F 盘,如下所示:

const form = new formidable.IncomingForm({ multiples: true });   form.uploadDir = 'F:\\' form.parse(req, (err, fields, file) => {     ... });

这种方式有一定局限性,如果写入的位置位于不同的磁盘空间该怎么办呢?

可以看下下面的这种方式。

读取-写入-删除临时文件

一种可行的办法是读取临时文件写入到新的位置,最后在删除临时文件。所以下述代码创建了可读流与可写流对象,使用 pipe  以管道的方式将数据写入新的位置,最后调用 fs 模块的 unlink 方法删除临时文件。

const mv = async (sourcePath, destPath) => {   try {     await fsPromises.rename(sourcePath, destPath);   } catch (error) {     if (error.code === 'EXDEV') {       const readStream = fs.createReadStream(sourcePath);         const writeStream = fs.createWriteStream(destPath);       return new Promise((resolve, reject) => {         readStream.pipe(writeStream);         readStream.on('end', onClose);         readStream.on('error', onError);         async function onClose() {           await fsPromises.unlink(sourcePath);           resolve();         }         function onError(err) {           console.error(`File write failed with message: ${err.message}`);             writeStream.close();           reject(err)         }       })     }      throw error;   } }

四:测试

方式一:终端调用

curl --location --request POST 'localhost:3000/upload/image' \ --form 'img=@/Users/Downloads/五月君.jpeg'

方式二:POSTMAN 调用

怎么实现图片上传写入磁盘的接口

到此,相信大家对“怎么实现图片上传写入磁盘的接口”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么实现图片上传写入磁盘的接口

本文链接: https://lsjlt.com/news/84092.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么实现图片上传写入磁盘的接口
    本篇内容主要讲解“怎么实现图片上传写入磁盘的接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现图片上传写入磁盘的接口”吧! 一:开启 Node...
    99+
    2024-04-02
  • Flask接收上传图片怎么实现
    本篇内容介绍了“Flask接收上传图片怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!思路整理:接收图片->定义一个图片存放的位...
    99+
    2023-07-02
  • laravel怎么实现上传图片的接口并建立软链接访问
    这篇文章主要介绍“laravel怎么实现上传图片的接口并建立软链接访问”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“laravel怎么实现上传图片的接口并建立软链接访问”文章能帮助大家解决问题。我们...
    99+
    2023-07-04
  • Springboot怎么实现图片上传
    1.首先图片上传,需要在数据库定义一个varchar类型的img字段图片字段  2.需要在pom文件加图片上传的配置文件   commons-io commons...
    99+
    2023-10-19
    mysql spring boot
  • php怎么实现上传图片
    PHP是一种广泛用于Web开发的服务器端脚本语言,可以实现很多Web功能。其中,上传图片是Web开发中常见的一项任务,本文将介绍PHP中的上传图片方法。一、基本概念在介绍上传图片方法之前,我们需要了解一些基本概念:$_FILES$_FILE...
    99+
    2023-05-14
  • 怎么用php实现图片上传
    这篇文章主要介绍了怎么用php实现图片上传的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用php实现图片上传文章都会有所收获,下面我们一起来看看吧。一、创建html页面首先,我们要创建一个html页面,这个...
    99+
    2023-07-05
  • Flask接收上传图片方法实现
    目录方案一:下面是复杂的写法:方案二:下面是简单写法:接下来给搭建讲解Flask如何接受图片文件,上面是复杂写法,下面是简单写法,二选一即可。 思路整理:接收图片->定义一个图...
    99+
    2024-04-02
  • html5怎么实现图片上传预览
    这篇文章主要介绍“html5怎么实现图片上传预览”,在日常操作中,相信很多人在html5怎么实现图片上传预览问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”html5怎么实现图...
    99+
    2024-04-02
  • PHP怎么实现上传图片功能
    本篇内容主要讲解“PHP怎么实现上传图片功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP怎么实现上传图片功能”吧!首先我们在form表单加上上传附件#file,上传按钮#imgbut,记...
    99+
    2023-06-04
  • Java怎么实现的图片上传工具类
    这篇文章给大家分享的是有关Java怎么实现的图片上传工具类的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:package com.gcloud.common;import javax....
    99+
    2023-05-31
    java
  • Python怎么实现不写硬盘上传文件
    本篇内容主要讲解“Python怎么实现不写硬盘上传文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现不写硬盘上传文件”吧!文本类型使用 io.StringIOimp...
    99+
    2023-07-02
  • 小程序怎么实现多图片上传
    这篇文章主要介绍“小程序怎么实现多图片上传”,在日常操作中,相信很多人在小程序怎么实现多图片上传问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序怎么实现多图片上传”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-26
  • java怎么实现图片上传并显示
    在Java中实现图片上传并显示的一种常见的方法是使用Servlet和JSP。下面是一个简单的示例代码: 创建一个Servlet类来...
    99+
    2023-10-24
    java
  • springboot实现通过路径从磁盘直接读取图片
    目录通过路径从磁盘直接读取图片访问本地(磁盘)图片通过路径从磁盘直接读取图片 这段时间在做Springboot和Vue的例子,读取图片给出路径直接可以读,太方便了,一直么有搞懂为什么...
    99+
    2024-04-02
  • Java实现图片上传至FastDFS入门教程
    今天来开始写图片上传的功能, 现在的图片上传都讲求 上传完成后立刻回显且页面不刷新, 这里到底是怎么做的呢? 当然是借助于ajax了, 但是ajax又不能提交表单, 这里我们...
    99+
    2024-04-02
  • thinkphp5怎么加layui实现图片上传功能
    本篇内容介绍了“thinkphp5怎么加layui实现图片上传功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!网站中很多表单都会用到上传图...
    99+
    2023-07-05
  • node.js中怎么实现kindEditor图片上传功能
    要在node.js中实现KindEditor的图片上传功能,可以使用以下步骤: 安装express框架和multer模块: np...
    99+
    2024-03-02
    node.js
  • Java实现文件分片上传接口的示例代码
    目录java后端分片上传接口前端分片java后端分片上传接口 文件上传工具--FileUtil package com.youmejava.chun.util; import l...
    99+
    2024-04-02
  • uniapp上传图片和上传视频的实现方法
    目录上传图片上传视频扩展补充:上传文件实例总结基于 uniapp 的应用上传图片/视频 资源的实现: 功能涉及的主要 uniapp API 如下: 1.选择图片:uni.choose...
    99+
    2023-01-17
    uniapp上传视频文件 uniapp 上传图片 vue视频上传
  • SpringBoot 利用MultipartFile上传本地图片生成图片链接的实现方法
    方法一 实现类: public String fileUpload(MultipartFile file) { if(file == null){ retu...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作