当前位置: 首页 > news >正文

如何将NextJs中的File docx保存到Prisma ORM

亿牛云.jpeg

背景/引言

在现代 Web 开发中,Next.js 是一个备受欢迎的 React 框架,它具有许多优点,如:

  • 服务器端渲染 (SSR):Next.js 支持服务器端渲染,可以提高页面加载速度,改善 SEO,并提供更好的用户体验。
  • 静态站点生成 (SSG):Next.js 还支持静态站点生成,使你可以预先生成页面并将其缓存,从而减少服务器负载。
  • 路由系统:Next.js 的路由系统非常灵活,可以轻松处理动态路由和参数。
  • 开发体验:Next.js 提供了热模块替换 (HMR)、TypeScript 支持、自动导入 CSS 等功能,使开发变得更加愉快。

在本文中,我们将探讨如何在 Next.js 应用中处理上传的 Word 文档 (.docx) 文件,并将其内容保存到 Prisma ORM 中。同时,我们还将介绍如何使用爬虫技术,通过代理 IP 从外部源获取数据。

正文

1. 设置NextJs项目

首先,我们需要创建一个新的NextJs项目,并安装所需的依赖包。

npx create-next-app my-nextjs-app
cd my-nextjs-app
npm install @prisma/client prisma multer

2. 配置Prisma ORM

初始化Prisma,并配置数据模型。

npx prisma init

prisma/schema.prisma文件中,添加一个Document模型:

model Document {id        Int      @id @default(autoincrement())name      Stringcontent   BytescreatedAt DateTime @default(now())
}

同步数据库:

npx prisma migrate dev --name init

3. 处理文件上传

在NextJs中,使用multer中间件来处理文件上传。创建一个API路由来接收上传的文件。

// pages/api/upload.js
import { PrismaClient } from '@prisma/client';
import multer from 'multer';const prisma = new PrismaClient();
const upload = multer();export const config = {api: {bodyParser: false,},
};const handler = async (req, res) => {upload.single('file')(req, res, async (err) => {if (err) {return res.status(500).send(err.message);}const { originalname, buffer } = req.file;const document = await prisma.document.create({data: {name: originalname,content: buffer,},});res.status(200).json(document);});
};export default handler;

4. 前端文件上传表单

创建一个简单的表单,用于上传docx文件。

// pages/index.js
import { useState } from 'react';const Home = () => {const [file, setFile] = useState(null);const handleFileChange = (e) => {setFile(e.target.files[0]);};const handleSubmit = async (e) => {e.preventDefault();const formData = new FormData();formData.append('file', file);const response = await fetch('/api/upload', {method: 'POST',body: formData,});const data = await response.json();console.log(data);};return (<form onSubmit={handleSubmit}><input type="file" onChange={handleFileChange} /><button type="submit">Upload</button></form>);
};export default Home;

5. 使用爬虫代理IP进行采集

在某些情况下,我们可能需要从外部源获取数据。这里展示如何使用代理IP进行爬虫,使用爬虫代理服务。

// utils/proxyScraper.js
const axios = require('axios');
const { HttpsProxyAgent } = require('https-proxy-agent');const proxy = {host: 'your-proxy-host', // 亿牛云爬虫代理的域名 www.16yun.cnport: 'your-proxy-port', // 亿牛云爬虫代理的端口auth: {username: 'your-username', // 亿牛云爬虫代理的用户名password: 'your-password', // 亿牛云爬虫代理的密码},
};const agent = new HttpsProxyAgent(`http://${proxy.auth.username}:${proxy.auth.password}@${proxy.host}:${proxy.port}`);const fetchData = async (url) => {try {const response = await axios.get(url, {httpsAgent: agent,});return response.data;} catch (error) {console.error('Error fetching data:', error);throw error;}
};module.exports = fetchData;

6. 示例爬取数据并存储到Prisma

示例代码展示如何使用上述代理IP配置,从外部源爬取数据,并将其存储到Prisma ORM中。

// pages/api/scrape.js
import { PrismaClient } from '@prisma/client';
import fetchData from '../../utils/proxyScraper';const prisma = new PrismaClient();const handler = async (req, res) => {try {const data = await fetchData('https://example.com/data-source');const document = await prisma.document.create({data: {name: 'Scraped Data',content: Buffer.from(data),},});res.status(200).json(document);} catch (error) {res.status(500).json({ error: 'Failed to fetch and save data' });}
};export default handler;

结论

本文介绍了如何在NextJs中处理docx文件上传,并将其存储到Prisma ORM中。同时,展示了如何使用爬虫代理进行采集,并将爬取到的数据存储到数据库中。通过这些示例代码,开发者可以更好地理解文件处理和数据存储的流程,并灵活应用代理IP技术来扩展数据获取能力。

相关文章:

  • 奇思妙想-可以通过图片闻见味道的设计
  • 数据网格和视图入门
  • Windows Docker Desktop 安装 postgres
  • openstack搭建
  • 如何开发高效服务(C++ )
  • Java——LinkedList
  • 基于C++、MFC和Windows套接字实现的简单聊天室程序开发
  • 软件服务中的 SLA 到底是什么?
  • React基础教程(07):条件渲染
  • iText7画发票PDF——小tips
  • QT:day1
  • Java:111-SpringMVC的底层原理(中篇)
  • 热门开源项目ChatTTS: 国内语音技术突破,实现弯道超车
  • WPF/C#:异常处理
  • 如何使用new和delete操作符进行动态内存分配和释放?
  • #Java异常处理
  • 《深入 React 技术栈》
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【面试系列】之二:关于js原型
  • docker容器内的网络抓包
  • JavaScript创建对象的四种方式
  • Java应用性能调优
  • leetcode386. Lexicographical Numbers
  • LintCode 31. partitionArray 数组划分
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • PAT A1017 优先队列
  • ubuntu 下nginx安装 并支持https协议
  • 测试如何在敏捷团队中工作?
  • 后端_MYSQL
  • 两列自适应布局方案整理
  • 聊聊directory traversal attack
  • 聊聊redis的数据结构的应用
  • 实战|智能家居行业移动应用性能分析
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 责任链模式的两种实现
  • Spring Batch JSON 支持
  • 第二十章:异步和文件I/O.(二十三)
  • 通过调用文摘列表API获取文摘
  • #07【面试问题整理】嵌入式软件工程师
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #每日一题合集#牛客JZ23-JZ33
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (3)llvm ir转换过程
  • (C语言)字符分类函数
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (vue)页面文件上传获取:action地址
  • (阿里云万网)-域名注册购买实名流程
  • (二十四)Flask之flask-session组件
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (三)mysql_MYSQL(三)
  • (顺序)容器的好伴侣 --- 容器适配器
  • (五十)第 7 章 图(有向图的十字链表存储)