【Next.js 入门教程系列】06-上传文件

原文链接

CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话, 给我的点个star,关注一下吧

上一篇【Next.js 入门教程系列】05-数据库

上传文件

选择云平台

  • Amazon S3
  • Google Cloud
  • Microsoft Azure
  • Cloudinary

Cloudinary 安装与配置

前往Cloudinary注册账号,注册好之后使用 npm i next-cloudinary 安装。

.env 文件中添加以下内容

复制代码
# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema

# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings

DATABASE_URL="mysql://root:@localhost:3306/nextapp"
# 添加下面这行,并修改为你的 Cloud Name
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME="<Your Cloud Name>"

上传文件

本章代码链接

Cloudinary 内置了几个上传组件供我们使用,在Cloudinary Widgets有详细的介绍

创建 /upload/page.tsx 并添加以下内容

复制代码
"use client";
import React from "react";
import { CldUploadWidget } from "next-cloudinary";

const UploadPage = () => {
  return (
    // 这里的 preset 换成你自己的 preset
    <CldUploadWidget uploadPreset="">
      {({ open }) => (
        <button className="btn btn-secondary" onClick={() => open()}>
          Upload
        </button>
      )}
    </CldUploadWidget>
  );
};
export default UploadPage;

其中的 preset 需要我们在 Cloudinary 的 settings/upload 中添加,设置好后,复制名字到 uploadPreset="" 即可

最终显示效果如下

Cloudinary Library可以查看上传上去的文件

展示上传的文件

本章代码链接

可以调用 CldImage 组件来显示上传上去的文件。直接使用图片的 publicID 即可

复制代码
"use client";
import React, { useState } from "react";
// import CldImage 用于展示图片
import { CldUploadWidget, CldImage } from "next-cloudinary";

interface CloudinrayResult {
  public_id: string;
}

const UploadPage = () => {
  const [publicId, setPublicId] = useState("");
  return (
    <>
      {publicId && (
        // 若图片Id不为空则渲染图片
        <CldImage src={publicId} width={270} height={180} alt={"a picture"} />
      )}
      <CldUploadWidget
        uploadPreset="bf9xjxfb"
        onUpload={(result, widget) => {
          if (result.event !== "success") return;
          //   成功上传后修改图片Id
          const info = result.info as CloudinrayResult;
          setPublicId(info.public_id);
        }}
      >
        {({ open }) => (
          <button className="btn btn-secondary" onClick={() => open()}>
            Upload
          </button>
        )}
      </CldUploadWidget>
    </>
  );
};
export default UploadPage;

自定义上传组件

本章代码链接

Cloudinary Demo可以自定义上传组件,包括颜色,文件来源,是否支持多文件等等

你也可以直接在调用时添加参数:

TypeScript 复制代码
<CldUploadWidget
  uploadPreset="bf9xjxfb"
  // 直接在这里设置
  options={{
    sources: ["local"],
  }}
  onUpload={(result, widget) => {
    if (result.event !== "success") return;
    const info = result.info as CloudinrayResult;
    setPublicId(info.public_id);
  }}
></CldUploadWidget>

CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话, 给我的点个star,关注一下吧

下一篇讲身份验证

下一篇【Next.js 入门教程系列】07-身份验证

相关推荐
放下华子我只抽RuiKe58 小时前
React 从入门到生产(四):自定义 Hook
前端·javascript·人工智能·深度学习·react.js·自然语言处理·前端框架
Richown9 小时前
全链路追踪:OpenTelemetry与Jaeger实战
区块链·react
idcu10 小时前
深入 Lyt.js 组件系统:L2 渲染引擎层的核心
前端·typescript
码云之上12 小时前
万星入坞·其三:SDK 轻量组件如何优雅地"点亮"
性能优化·架构·前端框架
阿正的梦工坊13 小时前
【Typescript】08-keyof-typeof-索引访问类型
linux·ubuntu·typescript
Richown14 小时前
容器编排:Kubernetes高级调度策略
区块链·react
星栈18 小时前
Rust 全栈项目里,我写了一个不再重复造轮子的泛型表格组件
前端·前端框架·开源
小四的小六18 小时前
我用什么技术做了TLDR Scholar?
typescript·ai编程
Maimai1080818 小时前
React 多步骤表单工程化落地:从 Zod Schema、React Hook Form 到 Zustand 持久化
前端·javascript·react.js·前端框架·状态模式
Maimai1080818 小时前
React Query + Zustand 正确结合方式:不要把接口数据复制进 Store
前端·javascript·react.js·前端框架·web3·状态模式