You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Next.js中上传图片并通过Real-ESRGAN处理后返回增强图?

实现Next.js图片上传+Real-ESRGAN增强的实操步骤

1. 前端上传组件(客户端组件)

在Next.js中创建客户端组件,实现图片选择、上传及结果展示:

'use client';

import { useState } from 'react';

export default function ImageEnhancer() {
  const [selectedFile, setSelectedFile] = useState(null);
  const [enhancedImageUrl, setEnhancedImageUrl] = useState(null);
  const [isLoading, setIsLoading] = useState(false);

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

  const handleSubmit = async (e) => {
    e.preventDefault();
    if (!selectedFile) return;

    setIsLoading(true);
    const formData = new FormData();
    formData.append('image', selectedFile);

    try {
      const res = await fetch('/api/enhance-image', {
        method: 'POST',
        body: formData,
      });

      if (!res.ok) throw new Error('处理失败');
      
      const data = await res.json();
      setEnhancedImageUrl(data.enhancedImageUrl);
    } catch (err) {
      console.error(err);
      alert('图片增强失败,请重试');
    } finally {
      setIsLoading(false);
    }
  };

  return (
    <div className="max-w-md mx-auto p-4">
      <form onSubmit={handleSubmit} className="space-y-4">
        <input
          type="file"
          accept="image/*"
          onChange={handleFileChange}
          className="block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100"
        />
        <button
          type="submit"
          disabled={!selectedFile || isLoading}
          className="w-full bg-blue-600 text-white py-2 px-4 rounded-md disabled:bg-gray-400"
        >
          {isLoading ? '增强中...' : '增强图片'}
        </button>
      </form>

      {enhancedImageUrl && (
        <div className="mt-6">
          <h3 className="text-lg font-medium mb-2">增强后的图片</h3>
          <img src={enhancedImageUrl} alt="Enhanced" className="w-full rounded-md" />
        </div>
      )}
    </div>
  );
}

2. 后端API路由(调用Real-ESRGAN模型)

在app/api/enhance-image/route.js创建API路由,处理图片上传并调用指定模型:

首先安装依赖(基于托管模型服务实现,避免本地部署算力不足):

npm install replicate

编写路由代码:

import { NextResponse } from 'next/server';
import Replicate from 'replicate';

const replicate = new Replicate({
  auth: process.env.REPLICATE_API_TOKEN,
});

export async function POST(request) {
  try {
    const formData = await request.formData();
    const image = formData.get('image');

    if (!image || !image.type.startsWith('image/')) {
      return NextResponse.json({ error: '请上传有效的图片文件' }, { status: 400 });
    }

    // 将File对象转为Base64格式供模型读取
    const arrayBuffer = await image.arrayBuffer();
    const base64Image = Buffer.from(arrayBuffer).toString('base64');
    const imageInput = `data:${image.type};base64,${base64Image}`;

    // 调用指定版本的Real-ESRGAN模型
    const output = await replicate.run(
      'cjwbw/real-esrgan:d0ee3d708c9b911f122a4ad90046c5d26a0293b99476d697f6bb7f2e251ce2d4',
      {
        input: {
          image: imageInput,
          scale: 2, // 支持2/3/4倍放大,可按需调整
        },
      }
    );

    return NextResponse.json({ enhancedImageUrl: output });
  } catch (err) {
    console.error('模型调用失败:', err);
    return NextResponse.json({ error: '图片增强服务异常' }, { status: 500 });
  }
}

3. 环境配置

在项目根目录创建.env.local文件,添加模型服务的API密钥:

REPLICATE_API_TOKEN=your_api_token_here

关键注意事项

  • 模型调用依赖算力资源,优先选择托管服务而非本地部署,避免Next.js服务器性能瓶颈
  • 前端需限制上传文件类型为图片,后端也要做二次校验
  • 可根据需求调整模型的scale参数,控制图片放大倍数
  • 若需要持久化增强后的图片,可将模型返回的URL转存到云存储后再返回给前端

内容的提问来源于stack exchange,提问作者user21841027

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:42:40