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

news2025/4/25 22:30:20

亿牛云.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      String
  content   Bytes
  createdAt 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.cn
  port: '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技术来扩展数据获取能力。

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

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

相关文章

【AI工具】jupyter notebook和jupyterlab对比和安装

简单说&#xff0c;jupyterlab是jupyter notebook的下一代。 选择安装一个即可。 一、这里是AI对比介绍 Jupyter Notebook和JupyterLab都是基于Jupyter内核的交互式计算环境&#xff0c;但它们在设计和功能上有一些关键的区别&#xff1a; 用户界面&#xff1a; Jupyter Not…

关于对pagination.js源代码进行修改且引入项目使用

实现效果 使用定时器对组件进行每秒请求&#xff0c;每过固定时间之后&#xff0c;进行下一页项目请求&#xff0c;进行到最后一页请求的时候返回第一页。 首先引入js插件 <script src"./js/pagination.js" type"text/javascript"></script>…

粉丝经济时代:微信订阅号如何助力中小企业增长

在数字化浪潮席卷全球的今天&#xff0c;微信订阅号凭借其独特的优势&#xff0c;成为了中小企业数字化出海的重要工具。作为NetFarmer&#xff0c;我们致力于帮助企业充分利用这一平台&#xff0c;推动业务发展和市场拓展。今天将深入探讨微信订阅号的概念、用途、使用方法、适…

若依修改浏览器标题logo

在线生成透明ICO图标——ICO图标制作https://www.ico51.cn/

使用ZIP包安装MySQL及配置教程

在本教程中&#xff0c;我们将指导您完成使用ZIP包安装MySQL的过程&#xff0c;并对配置文件进行必要的修改&#xff0c;以及解决可能遇到的问题。本示例以MySQL 5.7.44为例&#xff0c;但步骤同样适用于其他版本如MySQL 8.3.0等。请根据实际需要选择适合的版本下载&#xff1a…

【机器学习】神经网络与深度学习:探索智能计算的前沿

前沿 神经网络&#xff1a;模拟人类神经系统的计算模型 基本概念 神经网络&#xff0c;又称人工神经网络&#xff08;ANN, Artificial Neural Network&#xff09;&#xff0c;是一种模拟人类神经系统结构和功能的计算模型。它由大量神经元&#xff08;节点&#xff09;相互连…

报表生成中,左连接、内连接区别与应用

在报表生成中,最常用的连接类型包括:内连接(INNER JOIN)、左连接(LEFT JOIN)。以下是这些连接的简要介绍及其在报表中的应用场景: 左连接 左连接返回左表中的所有记录,以及右表中与左表匹配的记录。如果右表中没有匹配的记录,则右表中的字段值为NULL。 应用场景: …

汽车油耗NEDC与WLTP有什么区别?以及MATLAB/Simulink的汽车行驶工况仿真

最近的热点新闻非比亚迪的秦L莫属&#xff0c;其油耗达到2.9L/100km&#xff0c;但其标注为NEDC也引起了讨论&#xff0c; NEDC与WLTP的区别 NEDC的全称为“New European Driving Cycle”&#xff0c;即“新欧洲驾驶循环”。这种油耗测试标准起源于上世纪80年代&#xff0c;主…

Visual Studio Code远程linux计算云

一、前置条件 本机安装Visual Studio Code 打开Vscode时建议使用管理员权限打开&#xff0c;在这之前遇到了一些报错。 二、开始远程连接计算云 安装插件remote-ssh 2.点击远程资源管理器&#xff0c;之后在SSH这行的右侧&#xff0c;点击“”号&#xff0c;去新建远程 3.在窗…

Linux指令学习(4)

目录 0.普通用户和root用户之间的切换 1.head/tail指令 2.管道 3.date命令 4.三个查找相关的指令 5.文件过滤grep 6.打包和压缩 5.zip/unzip指令 0.普通用户和root用户之间的切换 &#xff08;1&#xff09;这个我们之前不是经常使用这个root用户吗&#xff0c;现在随着…

【安卓设备】通过adb批量安装apk

1、adb链接设备 H:\tv\apk>adb connect 127.0.0.1:21503 2、批量安装apk 如果地址不一致需要将 H:\tv\apk\ 改成自己的路径地址&#xff0c;同时注意该命令只能安装文件名为英文的不支持中文名称&#xff0c;如果有需要先更改文件名称。 H:\tv\apk>for %f in (H:\tv\a…

电商项目的性能测试流程,看完就懂!

今天给大家带来一套完整的性能测试实操流程&#xff0c;就以大家耳熟能详的电商项目来进行示例。现在就花个5分钟&#xff0c;认真看一下吧&#xff01; 一、核心业务梳理 做一个项目的性能测试&#xff0c;首先得梳理出哪些业务需要进行性能测试。这个过程有一个前提就是&…

openGauss学习笔记-300 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-SQL Rewriter SQL语句改写

文章目录 openGauss学习笔记-300 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-SQL Rewriter SQL语句改写300.1 概述300.2 使用指导300.2.1 前提条件300.2.2 使用方法示例300.3 获取帮助300.4 命令参考300.5 常见问题处理openGauss学习笔记-300 openGauss AI特性-AI…

【JS重点14】内置构造函数

一:Object构造函数 1 创建对象说明 Object是内置的构造函数&#xff0c;用于创建普通对象。 //通过构造函数方式创建普通对象 const user new Object({name:佩奇,age:18})相较于&#xff0c;利用字面量声明对象利用构造函数方式麻烦&#xff0c;因此推荐利用字面量方式声明…

OpenCV单词轮廓检测

OpenCV单词轮廓检测 0. 前言1. 策略分析2. 检测字符轮廓3. 检测单词轮廓相关链接 0. 前言 在根据文档图像执行单词转录时&#xff0c;通常第一步是识别图像中单词的位置。我们可以使用两种不同的方法识别图像中的单词&#xff1a; 使用 CRAFT、EAST 等深度学习技术使用基于 O…

【算法-力扣】72. 编辑距离(动态规划)

目录 一、题目描述 二、解题思路 三、参考答案 一、题目描述 编辑距离 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符 删除一个字符 替换一个字符 示例 1&#…

win11电脑桌面倒计时提醒怎么设置?

在日常工作中&#xff0c;我们经常需要处理大量的工作任务&#xff0c;而且很多任务都有时间限制。如果将这些任务记录在桌面上&#xff0c;并设置倒计时提醒&#xff0c;无疑会大大提高我们的工作效率。想象一下&#xff0c;在繁忙的工作间隙&#xff0c;你只需一瞥桌面&#…

618火爆来袭,退换货花费多咋办?

姐妹们&#xff0c;一年一度的618就要来了&#xff0c;你准备好了吗&#xff0c;虽然咱们的钱包鼓鼓的&#xff0c;但是咱们的购物袋也要鼓鼓的呀&#xff0c;我们就是要多买&#xff0c;多买&#xff0c;多买&#xff0c;这样才能更显示出自己更爱自己了。 言归正传&#xff…

2024.6.14 刷题总结

2024.6.14 **每日一题** 2786.访问数组中的位置使分数最大&#xff0c;看到这题就想到动态规划的思路&#xff0c;遍历数组&#xff0c;每次选择移动该元素时能获得到的最大值&#xff0c;分别考虑最后一个的元素为奇数/偶数的最大值&#xff0c;用长度为2的数组来储存这两个值…

JUnit 5学习笔记

JUnit 5 学习笔记 1.JUnit5的改变2.JUnit5常用注解及测试2.1 DisplayName/Disabled/BeforeEach/AfterEach/BeforeAll/AfterAll2.2 Timeout2.3 RepeatedTest 3.断言3.1 简单断言3.2 数组断言3.3 组合断言3.4 异常断言3.5 超时断言3.6 快速失败 4.前置条件5.嵌套测试6.参数化测试…