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

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

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

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]删除
最新教程 更多>
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-07-04
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-07-04
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-07-04
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的python功能eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
    编程 发布于2025-07-04
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-07-04
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-07-04
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-07-04
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-07-04
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-07-04
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-07-04
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-07-04
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c 的函数时,接受成员函数指针的函数时,必须同时提供对象的指针,并提供指针和指针到函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此)和成员函数指针。这可以通过修改Menubutton :: SetButton()(如下所示:[&& && && &&华)...
    编程 发布于2025-07-04
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-07-04
  • 在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8表中将latin1字符转换为utf8 ,您遇到了一个问题,其中含义的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致电。为了解决此问题,您正在尝试使用“ mb_convert_encoding”和“ iconv”转换受...
    编程 发布于2025-07-04
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-07-04

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

Copyright© 2022 湘ICP备2022001581号-3