vue3+threejs+koa可视化项目——模型文件上传(第四步)

文章目录

    • ⭐前言
      • 💖往期node系列文章
      • 💖threejs系列相关文章
      • 💖vue3+threejs系列
    • ⭐koa后端文件上传(koa-body)
      • 💖自动创建目录
      • 💖自定义目录上传
      • 💖apifox自测上传接口
    • ⭐vue3前端上传模型文件
      • 💖 axios 接口上传
      • 💖 使用 ant design vue 上传
    • ⭐总结
      • 💖 后端koa
      • 💖 前端vue3
    • ⭐结束

yma16-logo

⭐前言

大家好,我是yma16,本文分享关于 vue3+threejs+koa可视化项目——模型文件上传(第四步)。

multipart切片上传
multipart content type 是指一种HTTP报文中的Content-Type的类型,它可以将一个HTTP请求或响应分为多个部分,每个部分可以有自己的Content-Type和内容。这种类型的报文通常用于传输多个文件或者消息体,每个部分可以有不同的编码方式和内容类型,比如图片、文本等不同的数据类型。

💖往期node系列文章

node_windows环境变量配置
node_npm发布包
linux_配置node
node_nvm安装配置
node笔记_http服务搭建(渲染html、json)
node笔记_读文件
node笔记_写文件
node笔记_连接mysql实现crud
node笔记_formidable实现前后端联调的文件上传
node笔记_koa框架介绍
node_koa路由
node_生成目录
node_读写excel
node笔记_读取目录的文件
node笔记——调用免费qq的smtp发送html格式邮箱
node实战——搭建带swagger接口文档的后端koa项目(node后端就业储备知识)
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
node实战——koa给邮件发送验证码并缓存到redis服务(node后端储备知识)
node实战——koa实现文件下载和图片/pdf/视频预览(node后端储备知识)

💖threejs系列相关文章

THREE实战1_代码重构点、线、面
THREE实战2_正交投影相机与透视相机
THREE实战3_理解光源
THREE实战4_3D纹理
THREE实战5_canvans纹理
THREE实战6_加载fbx模型

💖vue3+threejs系列

vue3+threejs可视化项目——搭建vue3+ts+antd路由布局(第一步)
vue3+threejs可视化项目——引入threejs加载钢铁侠模型(第二步)
vue3+threejs+koa可视化项目——实现登录注册(第三步)

⭐koa后端文件上传(koa-body)

node 安装 koa-body

npm install koa-body

由于之前的博客是实现使用koa-bodyparser
需要卸载npm uninstall koa-bodyparser
引入koa-body

// 文件上传
app.use(koaBody({multipart: true
}))

💖自动创建目录

封装创建目录dirExists(不存在则创建)

const fs = require('fs');
const path = require('path');/*** 读取路径信息* @param {string} path 路径*/
function getStat(path) {return new Promise((resolve, reject) => {fs.stat(path, (err, stats) => {if (err) {resolve(false);} else {resolve(stats);}})})
}/*** 创建路径* @param {string} dir 路径*/
function mkdir(dir) {return new Promise((resolve, reject) => {fs.mkdir(dir, err => {if (err) {resolve(false);} else {resolve(true);}})})
}/*** 路径是否存在,不存在则创建* @param {string} dir 路径*/
async function dirExists(dir) {let isExists = await getStat(dir);//路径存在是目录if (isExists && isExists.isDirectory()) {return true;} else if (isExists) {// 文件return false;}//拿到上级路径let tempDir = path.parse(dir).dir;//递归判断,如果上级目录也不存在,则会代码会在此处继续循环执行,直到目录存在let status = await dirExists(tempDir);let mkdirStatus;if (status) {mkdirStatus = await mkdir(dir);}return mkdirStatus;
}module.exports={dirExists
}

💖自定义目录上传

实现文件上传

const {dirExists} =require("../../utils/createDir");const Router = require('koa-router');
const router = new Router();
const fs=require('fs')// 当前时间
const  getCurrentTime=() =>{const now = new Date()return `${now.valueOf()}`
};// upload file
router.post('/upload/file', async (ctx) => {try{// 获取上传的文件const file = ctx.request.files.files;console.log('file',file)const dir='./db/file/'+getCurrentTime()await dirExists(dir);const file_path=`${dir}/${file.originalFilename}`;console.log('file_path',file_path)// 创建可读流const reader = fs.createReadStream(file._writeStream.path);// 创建可写流const upStream = fs.createWriteStream(file_path);// 可读流通过管道写入可写流reader.pipe(upStream);ctx.body={'code':200,msg:'上传成功!'}}catch(e){ctx.body = {code: 0,data:e,msg: 'upload media fail'};}
});module.exports=router;

💖apifox自测上传接口

上传一张图片
upload-apifox

上传成功!
upload-success

⭐vue3前端上传模型文件

💖 axios 接口上传

http封装 上传配置content-type和token

// 实例
const createUploadInstance = (baseURL:string)=>{//tokenconst token = localStorage.getItem("userInfoPermissionToken")const Authorization = `bearer ${token}`return axios.create({baseURL:baseURL,timeout: 1000000,headers: {"Content-Type": "multipart/form-data",Authorization}})
};// @ts-ignore
const uploadHttp:any=createUploadInstance('');

上传接口

// @ts-ignore
import {uploadHttp} from "@/http/index";
export const uploadFile: any = (params: any) => {return uploadHttp.post("/api/upload/file", params);
};

💖 使用 ant design vue 上传

上传页面

<template>
<div><div>选择模型</div><a-upload-draggername="file":multiple="false":file-list="state.fileList":before-upload="beforeUpload"@remove="handleRemove"><p class="ant-upload-drag-icon"><inbox-outlined></inbox-outlined></p><p class="ant-upload-text">点击获取拖拽选择文件上传</p></a-upload-dragger><div style="margin-top: 20px;"><a-button type="primary" @click="handleUpload">上传</a-button></div>
</div>
</template>
<script lang="ts" setup>import { reactive } from 'vue';import { InboxOutlined } from '@ant-design/icons-vue';import { message } from 'ant-design-vue';import {uploadFile} from '@/service/upload/index'const state:any=reactive({loading:false,fileList:[]})const beforeUpload=(file:File)=>{state.fileList=[file]return false;}const handleRemove = (file) => {state.fileList=[]};const handleUpload = async () => {if(!state.fileList.length){return message.warn('请选择文件')}const formData = new FormData();state.fileList.forEach((file: any) => {formData.append('file', file as any);});state.loading = true;try{const res=await uploadFile(formData)console.log('res',res)}catch (e) {message.error(JSON.stringify(e))}};</script>

上传成功!
upload-vue3
上传iron_man模型文件成功!
upload-success

⭐总结

💖 后端koa

koa-body使用
koa-body是一个koa中间件,用于解析HTTP请求的body内容。它支持多种类型的body内容,包括json、form、text、multipart等。

使用koa-body的步骤如下:

  1. 安装koa-body模块:可以使用npm或者yarn进行安装。

    npm install koa-body
    
  2. 引入koa-body模块:在koa的代码文件中,使用require语句引入koa-body。

    const koaBody = require('koa-body');
    
  3. 注册koa-body中间件:在koa的代码文件中,使用app.use方法来注册koa-body中间件。

    app.use(koaBody());
    

    可以在传递koa-body的参数中指定解析body的类型和其他配置。例如,可以指定multipart的配置项如下:

    app.use(koaBody({multipart: true,formidable: {uploadDir: './uploads',keepExtensions: true,maxFileSize: 200 * 1024 * 1024}
    }));
    

    上述代码指定了将multipart类型的body解析为文件上传,并保存在"./uploads"目录下,同时限制了上传文件的大小为200MB。

  4. 在koa的路由处理函数中使用解析后的body内容:koa-body中间件会将解析后的body内容保存在ctx.request.body属性中,可以在koa的路由处理函数中通过ctx.request.body来使用解析后的body内容。

    router.post('/', async (ctx) => {const requestBody = ctx.request.body;// ...
    });
    

可以根据具体的需求配置koa-body中间件,具体的配置项可以参考koa-body的文档。

💖 前端vue3

http封装
Axios是一个基于Promise的HTTP客户端库,可以用于浏览器和Node.js。它提供了一种简单、直观的方式来发送HTTP请求和处理响应。

为了更好地使用和管理Axios,可以对其进行封装。封装Axios可以使代码更加简洁、易于维护,并提供一些常用的功能,如错误处理、拦截请求和响应等。

以下是一个简单的Axios封装示例:

import axios from 'axios';// 创建一个Axios实例
const instance = axios.create({baseURL: 'http://api.example.com', // 设置请求的基础URLtimeout: 5000 // 设置请求超时时间
});// 请求拦截器
instance.interceptors.request.use(config => {// 在发送请求之前做些什么return config;},error => {// 对请求错误做些什么return Promise.reject(error);}
);// 响应拦截器
instance.interceptors.response.use(response => {// 对响应数据做些什么return response.data;},error => {// 对响应错误做些什么return Promise.reject(error);}
);export default instance;

在封装的Axios实例中,可以设置一些通用的配置,如基础URL和超时时间。还可以通过请求拦截器在发送请求之前做一些操作,如添加请求头,对请求参数进行处理等。类似地,通过响应拦截器可以对响应数据进行处理,如统一处理错误,转换响应数据等。

封装后的Axios实例可以通过导入的方式在其他地方使用,简化了代码的编写和维护。可以根据实际需求,进一步封装一些通用的API请求方法,以便在项目中重复使用。

总之,封装Axios可以提高开发效率,增强代码的可读性和可维护性,并提供一些常用的功能。

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!

robot

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 最后,感谢你的阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 构建个人博客网站

1、项目地址 https://gitee.com/hhll/blog-hangliang.git 2、打包docker镜像并上传docker hub 【1】注册docker hub账号https://hub.docker.com/ 【2】在docker hub建对应的仓库 【3】登录docker hub并打包上传前后端镜像 sudo docker login -u xxxx 密码 xxxxxx 后端&am…

skywalking链路追踪

skywalking 1.简介1.1 skywalking介绍1.2 链路追踪框架对比1.3 Skywalking架构 2 环境构建2.1 windows环境2.1.1 启动skywalking服务和UI界面2.1.2 在IDEA启动项目中使用Skywalking2.1.3 skywalking持久化 2.2 linux环境 1.简介 微服务架构已经是一个很通用的系统架构&#xf…

WordPress可以做企业官网吗?如何用wordpress建公司网站?

我们在国内看到很多个人博客网站都是使用WordPress搭建&#xff0c;但是企业官网的相对少一些&#xff0c;那么WordPress可以做企业官网吗&#xff1f;如何用wordpress建公司网站呢&#xff1f;下面boke112百科就跟大家简单说一下。 WordPress是一款免费开源的内容管理系统&am…

MacBook有必要装清理软件吗?CleanMyMac X v4.14.6 直装特别版 附安装教程

MacBook是苹果公司的一款高端笔记本电脑&#xff0c;但是&#xff0c;随着使用时间的增长&#xff0c;MacBook也会出现一些问题&#xff0c;比如运行缓慢、卡顿、垃圾文件堆积、磁盘空间不足等。这些问题不仅影响了用户的使用体验&#xff0c;也可能对MacBook的寿命和安全性造成…

云原生数据库 GaiaDB 的核心技术演进和解析

导读 在越来越强调云原生的环境下&#xff0c;存算分离作为一种新的架构理念&#xff0c;已经是大势所趋。新的技术架构带来新的问题和挑战&#xff0c;百度智能云的云原生数据库 GaiaDB 采用 Quorum 分布式协议、高性能网络、高可靠分布式存储引擎等技术实现更高的性能和可用性…

React 中实现拖拽功能-插件 react-beautiful-dnd

拖拽功能在平时开发中是很常见的&#xff0c;这篇文章主要使用react-beautiful-dnd插件实现此功能。 非常好用&#xff0c;附上GitHub地址&#xff1a;https://github.com/atlassian/react-beautiful-dnd 安装及引入 // 1.引入 # yarn yarn add react-beautiful-dnd# npm npm…

2024美赛数学建模C题完整论文教学(含十几个处理后数据表格及python代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了数学建模美赛本次C题目Momentum in Tennis完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 C论文共49页&…

AI智能分析+明厨亮灶智慧管理平台助力“舌尖上的安全”

春节是中国最重要的传统节日之一&#xff0c;在春节期间&#xff0c;人们聚餐需求激增&#xff0c;餐饮业也迎来了高峰期。在这个时期&#xff0c;餐饮企业需要更加注重食品安全和卫生质量&#xff0c;以保证消费者的健康和权益&#xff0c;明厨亮灶智慧管理成为了餐饮业中备受…

【NTN 卫星通信】基于NTN的多3GPP连接应用场景

1 概述 同时聚合两条3GPP接入链路&#xff0c;其中一条为非地面网络&#xff0c;可以提供以下5G业务使能&#xff0c;尤其适用于带宽有限或接入链路不可靠的服务不足地区:   -扩展流动宽频   -超可靠的服务通信 如技术报告38.821所述&#xff0c;若干服务场景(例如在偏远地…

Unity 图片不改变比例适配屏幕

Unity 图片不改变比例适配屏幕 前言项目场景布置代码编写添加并设置脚本效果 前言 遇到一个要让图片适应相机大小&#xff0c;填满屏幕&#xff0c;但不改变图片比例的需求&#xff0c;记录一下。 项目 场景布置 代码编写 创建AdaptiveImageBackground脚本 using System.C…

电脑文件误删除怎么办?8个恢复软件解决电脑磁盘数据可能的误删

您是否刚刚发现您的电脑磁盘数据丢失了&#xff1f;不要绝望&#xff01;无论分区是否损坏、意外格式化或配置错误&#xff0c;存储在其上的文件都不一定会丢失到数字深渊。 我们已经卷起袖子&#xff0c;深入研究电脑分区恢复软件的广阔领域&#xff0c;为您带来一系列最有效…

精准医疗:DTAS尺寸公差仿真与尺寸链计算软件助力医疗器械制造的成功案例

随着医疗器械行业的不断发展和进步&#xff0c;对产品质量和安全性的要求也越来越高。而公差仿真软件作为一种能够帮助设计师和工程师优化产品设计并确保产品质量的工具&#xff0c;在医疗器械行业中的应用也变得越来越重要。 本文将探讨DTAS公差仿真软件在医疗器械中的应用&a…

【百度Apollo】探索创新之路:深入了解Apollo开放平台

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

前端面试题:二叉树广度和深度遍历

试题&#xff1a;有如下树形数据结构&#xff0c;通过JavaScript对二叉树实现深度遍历和广度遍历 广度遍历&#xff1a; 通过JavaScript数组模拟栈的方式实现&#xff0c;首先节点入栈&#xff0c;然后从栈顶取出节点&#xff0c;放入数组&#xff0c;然后对取出的节点进行遍历…

Haas 开发板连接阿里云上传温湿度和电池电压

目录 一、在阿里云上创建一个产品 二、开发环境的介绍 三、创建wifi示例 四、编写SI7006和ADC驱动 五、wifi配网 六、主要源码 七、查看实现结果 一、在阿里云上创建一个产品 登录自己的阿里云账号&#xff0c; 应该支付宝&#xff0c;淘宝账号都是可以的。 接着根据需求…

k8s学习-Kubernetes的包管理器Helm

1.1 为何需要Helm Kubernetes能够很好地组织和编排容器&#xff0c;但它缺少⼀个更高层次的应用打包工具&#xff0c;而Helm就是来干这件事的。 先来看个例子。 比如对于⼀个MySQL服务&#xff0c;Kubernetes需要部署下面这些对象&#xff1a; &#xff08;1&#xff09;Serv…

云计算、Docker、K8S问题

1 云计算 云计算作为一种新兴技术&#xff0c;已经在现代社会中得到了广泛应用。它以其高效、灵活和可扩展特性&#xff0c;成为了许多企业和组织在数据处理和存储方面的首选方案。 1.1 什么是云计算&#xff1f;它有哪些特点&#xff1f; 云计算是一种通过网络提供计算资源…

【Python小游戏】五子棋小游戏(完整代码)

文章目录 写在前面Tkinter简介五子棋小游戏游戏介绍程序设计运行结果注意事项写在后面写在前面 本期内容:基于tkinter开发一个五子棋小游戏 实验环境 python3.11及以上pycharmtkinterTkinter简介 Tkinter是Python中最常用的图形用户界面(GUI)库之一,用于创建窗口、对话框…

【Java 数据结构】String进阶

字符串常量池 1. 创建对象的思考2. 字符串常量池(StringTable)3. 再谈String对象创建 1. 创建对象的思考 下面两种创建String对象的方式相同吗&#xff1f; public static void main(String[] args) {String s1 "hello";String s2 "hello";String s3 …

微信小程序(二十八)网络请求数据进行列表渲染

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.GET请求的规范 2.数据赋值的方法 源码&#xff1a; index.wxml <!-- 列表渲染基础写法&#xff0c;不明白的看上一篇 --> <view class"students"><view class"item">&…