”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 在 Next.js 中上传图像(文件上传、Filestack)

在 Next.js 中上传图像(文件上传、Filestack)

发布于2024-11-12
浏览:998

Uploading Images in Next.js (File Uploads, Filestack)

一、简介

在 Next.js 中上传图像是开发 Web 应用程序时的一项常见任务。在本教程中,我们将探索两种不同的方法:

  • 直接上传文件到您的后端(使用 Next.js)。
  • 使用 Filestack,一种简化云中文件管理的服务。

先决条件:

  • 已安装最新版本的Next.js
  • React基础知识Node.js.
  • 对于 Filestack 部分,您将需要一个
  • Filestack 帐户
2.直接上传图片(文件上传)

首先,让我们看看如何直接在 Next.js 中处理文件上传而不使用外部服务。

第 1 步:在 Next.js 中创建上传表单

在所需组件中创建一个表单以选择并上传图像。这里,我们使用useState来存储文件并获取以将其发送到后端。


从 'react' 导入 { useState }; 导出默认函数UploadForm() { const [selectedFile, setSelectedFile] = useState(null); const handleFileChange = (事件) => { setSelectedFile(event.target.files[0]); }; const handleSubmit = 异步(事件)=> { event.preventDefault(); const formData = new FormData(); formData.append('文件', selectedFile); const 响应 = 等待 fetch('/api/upload', { 方法:'POST', 正文:表单数据, }); 如果(响应.ok){ console.log('文件上传成功'); } 别的 { console.error('上传文件时出错'); } }; 返回 (
形式> ); }
import { useState } from 'react';

export default function UploadForm() {
  const [selectedFile, setSelectedFile] = useState(null);

  const handleFileChange = (event) => {
    setSelectedFile(event.target.files[0]);
  };

  const handleSubmit = async (event) => {
    event.preventDefault();
    const formData = new FormData();
    formData.append('file', selectedFile);

    const response = await fetch('/api/upload', {
      method: 'POST',
      body: formData,
    });

    if (response.ok) {
      console.log('File uploaded successfully');
    } else {
      console.error('Error uploading file');
    }
  };

  return (
    
); } 第 2 步:创建 API 来处理上传

现在,在 Next.js 中创建一个端点以在后端处理图像。我们将使用 Next.js 的 API 路由来处理服务器端操作。

在pages/api/upload.js中创建文件:


从'fs'导入fs; 从“路径”导入路径; 导出常量配置= { 应用程序编程接口:{ bodyParser: false, // 禁用 bodyParser 处理大文件 }, }; 导出默认异步函数处理程序(req,res){ if (req.method === 'POST') { 常量块= []; req.on('数据', (块) => { chunks.push(块); }); req.on('结束', () => { const buffer = Buffer.concat(chunks); const filePath = path.resolve('.', '上传', 'image.png'); // 保存到 `uploads` 文件夹 fs.writeFileSync(filePath, 缓冲区); res.status(200).json({ message: '文件上传成功' }); }); } 别的 { res.status(405).json({ message: '方法不允许' }); } }
import { useState } from 'react';

export default function UploadForm() {
  const [selectedFile, setSelectedFile] = useState(null);

  const handleFileChange = (event) => {
    setSelectedFile(event.target.files[0]);
  };

  const handleSubmit = async (event) => {
    event.preventDefault();
    const formData = new FormData();
    formData.append('file', selectedFile);

    const response = await fetch('/api/upload', {
      method: 'POST',
      body: formData,
    });

    if (response.ok) {
      console.log('File uploaded successfully');
    } else {
      console.error('Error uploading file');
    }
  };

  return (
    
); } 第三步:创建上传文件夹

确保项目根目录中有一个名为 uploads 的文件夹。您可以手动创建:


mkdir上传
import { useState } from 'react';

export default function UploadForm() {
  const [selectedFile, setSelectedFile] = useState(null);

  const handleFileChange = (event) => {
    setSelectedFile(event.target.files[0]);
  };

  const handleSubmit = async (event) => {
    event.preventDefault();
    const formData = new FormData();
    formData.append('file', selectedFile);

    const response = await fetch('/api/upload', {
      method: 'POST',
      body: formData,
    });

    if (response.ok) {
      console.log('File uploaded successfully');
    } else {
      console.error('Error uploading file');
    }
  };

  return (
    
); } 有了这个,您现在可以选择图像并将其直接上传到您的服务器。

3. 使用Filestack上传图片

现在,如果您更喜欢使用

Filestack 等外部服务,它提供文件托管、CDN 和高效的图像处理,请按照以下步骤操作。

第1步:安装Filestack

首先,我们需要在您的 Next.js 项目中安装 Filestack 包。


npm 安装 filestack-js
import { useState } from 'react';

export default function UploadForm() {
  const [selectedFile, setSelectedFile] = useState(null);

  const handleFileChange = (event) => {
    setSelectedFile(event.target.files[0]);
  };

  const handleSubmit = async (event) => {
    event.preventDefault();
    const formData = new FormData();
    formData.append('file', selectedFile);

    const response = await fetch('/api/upload', {
      method: 'POST',
      body: formData,
    });

    if (response.ok) {
      console.log('File uploaded successfully');
    } else {
      console.error('Error uploading file');
    }
  };

  return (
    
); } 第 2 步:在前端设置 Filestack

接下来,让我们在组件中设置 Filestack 小部件,以便用户可以选择和上传图像。这很简单,因为 Filestack 提供了一个随时可用的小部件。

这是一个示例实现:


从 'react' 导入 { useState }; 从“filestack-js”导入*作为文件堆栈; const client = filestack.init('YOUR_API_KEY'); // 替换为您的 API 密钥 导出默认函数 FilestackUpload() { const [imageUrl, setImageUrl] = useState(''); const handleUpload = async () => { const 结果 = 等待 client.picker({ onUploadDone: (res) => { setImageUrl(res.filesUploaded[0].url); console.log('文件上传:', res.filesUploaded[0].url); }, })。打开(); }; 返回 (
{imageUrl && 上传的图片}
); }
import { useState } from 'react';

export default function UploadForm() {
  const [selectedFile, setSelectedFile] = useState(null);

  const handleFileChange = (event) => {
    setSelectedFile(event.target.files[0]);
  };

  const handleSubmit = async (event) => {
    event.preventDefault();
    const formData = new FormData();
    formData.append('file', selectedFile);

    const response = await fetch('/api/upload', {
      method: 'POST',
      body: formData,
    });

    if (response.ok) {
      console.log('File uploaded successfully');
    } else {
      console.error('Error uploading file');
    }
  };

  return (
    
); } 第 3 步:获取 Filestack API 密钥

要使 Filestack 正常工作,您需要在 Filestack 上创建一个帐户并生成您的

API 密钥。将上述代码中的 YOUR_API_KEY 替换为提供给您的密钥。

第四步:显示上传的图片

用户上传图像后,您可以使用 Filestack 生成的 URL 显示它:


{imageUrl && 上传的图片}
import { useState } from 'react';

export default function UploadForm() {
  const [selectedFile, setSelectedFile] = useState(null);

  const handleFileChange = (event) => {
    setSelectedFile(event.target.files[0]);
  };

  const handleSubmit = async (event) => {
    event.preventDefault();
    const formData = new FormData();
    formData.append('file', selectedFile);

    const response = await fetch('/api/upload', {
      method: 'POST',
      body: formData,
    });

    if (response.ok) {
      console.log('File uploaded successfully');
    } else {
      console.error('Error uploading file');
    }
  };

  return (
    
); } 4. 结论

就是这样!您现在有两种方法来处理 Next.js 应用程序中的图像上传:

  • 直接上传到您的后端。
  • 使用 Filestack 上传,如果您不想自己管理文件存储,这将为您提供更高级和可扩展的解决方案。
版本声明 本文转载于:https://dev.to/adrianbailador/uploading-images-in-nextjs-file-uploads-filestack-47od?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-15
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-15
  • 如何使用 GCC 捕获 Linux 中的分段错误?
    如何使用 GCC 捕获 Linux 中的分段错误?
    捕获 Linux 中的分段错误问:我在第三方库中遇到分段错误,但我无法解决根本问题。是否有跨平台或特定于平台的解决方案来使用 gcc 捕获 Linux 中的这些错误?A:Linux 允许将分段错误作为异常处理。当程序遇到此类故障时,它会收到 SIGSEGV 信号。通过设置信号处理程序,您可以拦截此信...
    编程 发布于2024-11-15
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-15
  • 如何在不创建实例的情况下访问Go结构体的类型?
    如何在不创建实例的情况下访问Go结构体的类型?
    在不创建物理结构的情况下访问 Reflect.Type在 Go 中,动态加载问题的解决方案需要访问结构的类型,而无需物理创建它们。虽然现有的解决方案要求在类型注册之前创建结构体并清零,但存在一种更有效的方法。人们可以利用 reflect.TypeOf((*Struct)(nil)).Elem()手术...
    编程 发布于2024-11-15
  • Java中如何高效地将整数转换为字节数组?
    Java中如何高效地将整数转换为字节数组?
    Java 中整数到字节数组的高效转换将整数转换为字节数组可用于多种目的,例如网络传输或数据存储。有多种方法可以实现此转换。ByteBuffer 类:一种有效的方法是使用 ByteBuffer 类。 ByteBuffer 是一个存储二进制数据并提供各种操作来操纵它的缓冲区。使用 ByteBuffer ...
    编程 发布于2024-11-15
  • 如何在 Go 中按多个字段对结构体切片进行排序?
    如何在 Go 中按多个字段对结构体切片进行排序?
    按多个字段对切片对象进行排序按多个条件排序考虑以下 Parent 和 Child 结构:type Parent struct { id string children []Child } type Child struct { id string }假设我们有一个...
    编程 发布于2024-11-15
  • Qt 线程与 Python 线程:我应该在 PyQt 应用程序中使用哪个?
    Qt 线程与 Python 线程:我应该在 PyQt 应用程序中使用哪个?
    PyQt 应用程序中的线程:Qt 线程与 Python 线程寻求使用 PyQt 创建响应式 GUI 应用程序的开发人员经常遇到执行的挑战长时间运行的任务而不影响 UI 的功能。一种解决方案是使用单独的线程来完成这些任务。这就提出了是使用 Qt 线程还是原生 Python 线程模块的问题。Qt 线程提...
    编程 发布于2024-11-15
  • 为什么我的PHP提交按钮没有触发回显和表格显示?
    为什么我的PHP提交按钮没有触发回显和表格显示?
    PHP 提交按钮困境:不可用的回显和表格您的代码打算在单击“提交”按钮时显示回显和表格在 PHP 表单上。但是,您遇到了这些元素仍然隐藏的问题。这是因为您使用 if(isset($_POST['submit'])) 来控制这些元素的显示,但提交按钮缺少 name 属性。解决方案:提供...
    编程 发布于2024-11-15
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-15
  • 为什么我的 @font-face EOT 字体无法在 Internet Explorer 中通过 HTTPS 加载?
    为什么我的 @font-face EOT 字体无法在 Internet Explorer 中通过 HTTPS 加载?
    @font-face EOT 无法通过 HTTPS 加载:解决方案遇到 @font-face EOT 文件在 Internet 中无法通过 HTTPS 加载的问题在 Explorer 版本 7、8 和 9 中,用户发现无论 HTTPS 上包含的 HTML 页面的托管状态如何,问题仍然存在。经过实验,...
    编程 发布于2024-11-15
  • 为什么通过 Makefile 运行 Go 程序时出现“权限被拒绝”错误?
    为什么通过 Makefile 运行 Go 程序时出现“权限被拒绝”错误?
    权限被拒绝:调查“go run”和 Makefile 调用之间的差异通过 Makefile 运行 Go 程序时遇到权限被拒绝错误可能会令人困惑。此问题源于 GNU make 或其 gnulib 组件中的错误。根本原因在于系统 PATH 中存在一个名为“go”的目录,该目录位于实际 Go 可执行文件所...
    编程 发布于2024-11-15
  • 可以使用 CSS 设计 SVG 背景图像吗?
    可以使用 CSS 设计 SVG 背景图像吗?
    您可以使用 CSS 设计 SVG 背景图像吗?作为 SVG 爱好者,您精通将 SVG 用作背景图像。然而,仍然存在一个持续存在的问题:您是否也可以在同一个文件中使用 CSS 设计 SVG 样式?遗憾的是,答案是不。用作背景图像的 SVG 被视为与 CSS 样式表隔离的单个实体。 CSS 文件中的样式...
    编程 发布于2024-11-15
  • 能否结合使用 LIKE 和 IN 来实现更强大的 SQL 查询?
    能否结合使用 LIKE 和 IN 来实现更强大的 SQL 查询?
    结合LIKE和IN进行高级SQL查询在SQL中,LIKE运算符经常用于模式匹配,而IN运算符允许我们将一个值与一系列特定值进行匹配。虽然这些运算符有不同的用途,但可以将它们组合起来创建更强大的查询。让我们考虑以下场景:您有一个表,其中有一列名为“company_id”,并且您想要选择其中包含该列的所...
    编程 发布于2024-11-15
  • 为什么PHP中逗号可以用于回显但不能用于返回?
    为什么PHP中逗号可以用于回显但不能用于返回?
    为什么用逗号回显有效,而用逗号返回却不起作用?在 PHP 中使用 echo 和 return 连接值时,有使用句号和逗号之间的细微差别。具体来说:Echo:允许以逗号分隔的多个表达式回显到输出。返回:只能返回一个单个表达式。使用句点句点 (.) 运算符将字符串或其他数据类型连接成单个字符串。例如:e...
    编程 发布于2024-11-15

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3