使用CloudFlare R2上传图片慢怎么解决

最近在做项目的时候,打算用Cloud flare R2来存储图片,按照网上的教程配置好后,总算能够成功上传图片了,产品上线后,发现上传图片经常很慢,就对代码进行了优化。

1.使用edge function上传图片

edge function号称边缘函数,说会提升性能。

ini 复制代码
// Edge Runtime 配置
export const runtime = 'edge';
export const regions = ['hkg1'];

但是我按照这种方式配置后,发现上传速度并没有什么提升。

2.先压缩图片再上传

难道是图片太大了,导致上传慢,于是我采用前端压缩的方式进行上传

ini 复制代码
export async function compressImage(
  file: File,
  options: CompressionOptions = {}
): Promise<File> {
  const opts = { ...defaultCompressionOptions, ...options };

  // 如果不是图片文件,直接返回原文件
  if (!file.type.startsWith('image/')) {
    return file;
  }

  return new Promise((resolve, reject) => {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    const img = new Image();

    img.onload = () => {
      try {
        // 计算压缩后的尺寸
        let { width, height } = img;

        // 如果图片尺寸超过最大限制,按比例缩放
        if (width > opts.maxWidth! || height > opts.maxHeight!) {
          const ratio = Math.min(opts.maxWidth! / width, opts.maxHeight! / height);
          width = Math.floor(width * ratio);
          height = Math.floor(height * ratio);
        }

        // 设置画布尺寸
        canvas.width = width;
        canvas.height = height;

        // 绘制压缩后的图片
        ctx?.drawImage(img, 0, 0, width, height);

        // 转换为 Blob
        canvas.toBlob(
          (blob) => {
            if (!blob) {
              reject(new Error('图片压缩失败'));
              return;
            }

            // 检查文件大小是否超过限制
            const sizeMB = blob.size / (1024 * 1024);
            if (sizeMB > opts.maxSizeMB!) {
              // 如果仍然太大,进一步降低质量
              const newQuality = Math.max(0.1, opts.quality! * 0.7);
              canvas.toBlob(
                (newBlob) => {
                  if (!newBlob) {
                    reject(new Error('图片压缩失败'));
                    return;
                  }

                  const compressedFile = new File([newBlob], file.name, {
                    type: file.type,
                    lastModified: Date.now()
                  });
                  resolve(compressedFile);
                },
                file.type,
                newQuality
              );
            } else {
              const compressedFile = new File([blob], file.name, {
                type: file.type,
                lastModified: Date.now()
              });
              resolve(compressedFile);
            }
          },
          file.type,
          opts.quality
        );
      } catch (error) {
        reject(error);
      }
    };

    img.onerror = () => {
      reject(new Error('图片加载失败'));
    };

    // 创建图片对象
    const reader = new FileReader();
    reader.onload = (e) => {
      img.src = e.target?.result as string;
    };
    reader.onerror = () => {
      reject(new Error('文件读取失败'));
    };
    reader.readAsDataURL(file);
  });
}

修改完代码后,在本地测试感觉是快了不少,于是马上上线测试,发现还是有点慢。 又各种查资料,看来还是Cloud flare R2配置的问题。

添加自定义域名:

在R2 Object storage中的setting页面进行配置(为了和主域名区分,请使用子域名,比如cdn.example.com)。

配置好自定义域名之后,再修改环境变量就好啦。 现在去尝试下上传图片,明显快多了。

相关推荐
Gust of wind11 分钟前
串与KMP模式匹配:存储结构、基本操作、next数组手算
c语言·数据结构·后端·算法
endswel19 分钟前
Spring bean 注册多种方式
java·后端·spring
铁皮饭盒23 分钟前
还是网页端, 46mb模型, 抠图功能升级了, 抠任意主体, 还是不要显卡, 不要python, 满意吗?
前端·javascript·后端
小林coding30 分钟前
Flash模型又添一员大将:实测MiniMax M3.1
后端
颜进强1 小时前
25 · NestJs DurableProviders 持久化 Provider:把 ContextId 当缓存键
前端·后端·ai编程
tltwuyulw1 小时前
Java的函数式编程(四)
后端
我的xiaodoujiao1 小时前
Django 基础知识详细图文教程 14-Django 表单定义与使用
开发语言·后端·python·django
颜进强1 小时前
24 · NestJs LazyLoadingModules 懒加载模块:你在前端天天 `import()` 懒路由,但 Nest 偏偏不能懒加载路由
前端·后端·ai编程
Mav1 小时前
[个人学习记录]从零构建高性能 LLM 推理网关:为什么普通轮询会击穿显存?Nginx 平滑加权轮询(SWRR)在 Go 中的 57ns 零分配实战
后端