简体   繁体   中英

remix.run how do I resize images before uploading to cloudinary?

I wish to resize images to about 500px x 500px before uploading it to cloundary. How I resize the images that is in AsyncIterable Uint8Array format. I would like to do this in the uploadImageToCloudinary function. I have tried resizing it with sharp package but i dont know how to convert data AsyncIterable to be compatible with the sharp package.

import {

  redirect,
  unstable_composeUploadHandlers,

  unstable_createMemoryUploadHandler,
  unstable_parseMultipartFormData,
} from "@remix-run/node";

// writeAsyncIterableToWritable is a Node-only utility
import { writeAsyncIterableToWritable } from "@remix-run/node";
import type {

  UploadApiResponse,

} from "cloudinary";
import { v2 as cloudinary } from "cloudinary";
import cuid from "cuid";

import { createInstagram } from "~/models/instagram.server";
import { createNewOrder } from "~/models/order.server";

cloudinary.config({
  cloud_name: process.env.CLOUDINARY_NAME,
  api_key: process.env.CLOUDINARY_API_KEY,
  api_secret: process.env.CLOUDINARY_API_SECRET,
});

async function uploadImageToCloudinary(data: AsyncIterable<Uint8Array>) {
  let randomFolder = (Math.random() + 1).toString(36).substring(5);

  const uploadPromise = new Promise<UploadApiResponse>(
    async (resolve, reject) => {
      const uploadStream = cloudinary.uploader.upload_stream(
        {
          folder: `file_uplaoded/${randomFolder}`,
        },
        (error, result) => {
          if (error) {
            reject(error);
            return;
          }
          resolve(result);
        }
      );
      await writeAsyncIterableToWritable(data, uploadStream);
    }
  );

  return uploadPromise;
}

export const action = async ({ request }) => {
  let selectedLargePhotosURLArray: any = [];

  const uploadHandler = unstable_composeUploadHandlers(
    // our custom upload handler
    async ({ name, contentType, data, filename }) => {
      const regexFileExtension = /\.[0-9a-z]+$/gm;
      const fileExtension = filename?.match(regexFileExtension);
      if (fileExtension != undefined && fileExtension?.length > 0) {
        const lowCaseFileExt = fileExtension[0].toLowerCase();
        let allowedFileExtension =
          lowCaseFileExt === ".png" ||
          lowCaseFileExt === ".jpg" ||
          lowCaseFileExt === ".jpeg" ||
          lowCaseFileExt === ".heic" ||
          lowCaseFileExt === ".gif"
            ? true
            : false;
        if (
          name === "petImages" &&
          filename !== undefined &&
          allowedFileExtension
        ) {
          const uploadedImage = await uploadImageToCloudinary(data);
          console.log(uploadedImage.secure_url);
          selectedLargePhotosURLArray.push(uploadedImage.secure_url);
          return uploadedImage.secure_url;
        }
      }
    },
    // fallback to memory for everything else
    unstable_createMemoryUploadHandler({
      maxPartSize: 300000000,
    })
  );

  const formData = await unstable_parseMultipartFormData(
    request,
    uploadHandler
  );

 

  return null
};

Cloudinary has a feature called Upload Presets which can be used for image transformations.

To enable that, do to your Cloudinary Account -> Click Settings (cog icon) -> Upload Manipulations -> Incoming Transformation, set your desired settings and save.

Now you can use the preset like this:

const uploadStream = cloudinary.uploader.upload_stream(
  {
    upload_preset: `preset_name`,
    folder: `file_uplaoded/${randomFolder}`,
  },
  (error, result) => {
    if (error) {
      reject(error)
      return
    }
    resolve(result)
  },
)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM