{"id":20079302,"url":"https://github.com/mohammadoftadeh/multer-sharp-resizer","last_synced_at":"2025-07-18T10:33:21.493Z","repository":{"id":57304964,"uuid":"268457448","full_name":"mohammadoftadeh/multer-sharp-resizer","owner":"mohammadoftadeh","description":"📸  🖼  Resize one image or multiple images to multiple sizes with node.js, express.js, multer.js and sharp.js","archived":false,"fork":false,"pushed_at":"2023-04-09T19:58:28.000Z","size":19,"stargazers_count":15,"open_issues_count":1,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-23T18:16:09.268Z","etag":null,"topics":["expressjs","multer","multer-sharp-resizer","nodejs","resize-images","sharp","upload"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/multer-sharp-resizer","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mohammadoftadeh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-01T07:46:35.000Z","updated_at":"2025-01-14T21:13:04.000Z","dependencies_parsed_at":"2024-11-13T15:34:15.668Z","dependency_job_id":null,"html_url":"https://github.com/mohammadoftadeh/multer-sharp-resizer","commit_stats":{"total_commits":14,"total_committers":2,"mean_commits":7.0,"dds":0.2142857142857143,"last_synced_commit":"d062f80f45782d68e603d69f544f4178442f3ab1"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mohammadoftadeh/multer-sharp-resizer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mohammadoftadeh%2Fmulter-sharp-resizer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mohammadoftadeh%2Fmulter-sharp-resizer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mohammadoftadeh%2Fmulter-sharp-resizer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mohammadoftadeh%2Fmulter-sharp-resizer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mohammadoftadeh","download_url":"https://codeload.github.com/mohammadoftadeh/multer-sharp-resizer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mohammadoftadeh%2Fmulter-sharp-resizer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265742689,"owners_count":23820889,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["expressjs","multer","multer-sharp-resizer","nodejs","resize-images","sharp","upload"],"created_at":"2024-11-13T15:21:33.222Z","updated_at":"2025-07-18T10:33:21.474Z","avatar_url":"https://github.com/mohammadoftadeh.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# multer-sharp-resizer\n\n[Multer-sharp-resizer](https://www.npmjs.com/package/multer-sharp-resizer) is a package for Resizing single/multiple images with node.js, express.js, multer.js [Multer documentation](https://www.npmjs.com/package/multer) and sharp.js [sharp documentation](https://www.npmjs.com/package/sharp).\n\n\u003e **Multer-sharp-resizer:** Resize one image or multiple images to multiple sizes with node.js, express.js, multer.js\n\n# Documentation\n\n[![Node.js uploading image with multer and multer-sharp-resizer](https://github.com/mohammadoftadeh/repo-assets/blob/main/multer-sharp-resizer(nodejs%20upload).png?raw=true)](https://youtu.be/lgm5MfOFeLM)\n\n# Installation\n\nnpm:\n\n```\n$ npm i multer multer-sharp-resizer\n```\n\nyarn:\n\n```\n$ yarn add multer multer-sharp-resizer\n```\n\n# Usage\n\n```javascript\nconst express = require(\"express\");\nconst multer = require(\"multer\");\nconst MulterSharpResizer = require(\"multer-sharp-resizer\");\n\n    ...\n\n    const today = new Date();\n    const year = today.getFullYear();\n    const month = `${today.getMonth() + 1}`.padStart(2, \"0\");\n\n    const filename = `gallery-${Date.now()}`;\n\n    const sizes = [\n      {\n        path: \"original\",\n        width: null,\n        height: null,\n      },\n      {\n        path: \"large\",\n        width: 800,\n        height: 800,\n      },\n      {\n        path: \"medium\",\n        width: 300,\n        height: 300,\n      },\n      {\n        path: \"thumbnail\",\n        width: 100,\n        height: 100,\n      },\n    ];\n\n    const uploadPath = `./public/uploads/${year}/${month}`;\n\n    const fileUrl = `${req.protocol}://${req.get(\n      \"host\"\n    )}/uploads/${year}/${month}`;\n\n    // sharp options\n    const sharpOptions = {\n      fit: \"contain\",\n      background: { r: 255, g: 255, b: 255 },\n    };\n\n    // create a new instance of MulterSharpResizer and pass params\n    const resizeObj = new MulterSharpResizer(\n      req,\n      filename,\n      sizes,\n      uploadPath,\n      fileUrl,\n      sharpOptions\n    );\n\n    // call resize method for resizing files\n    await resizeObj.resize();\n\n    // get details of uploaded files\n    const images = resizeObj.getData();\n\n    ....\n```\n\n#### example for uploading multiple/single images:\n\n```javascript\nconst express = require(\"express\");\nconst app = express();\nconst multer = require(\"multer\");\nconst MulterSharpResizer = require(\"multer-sharp-resizer\");\n\napp.use(express.static(`${__dirname}/public`));\napp.use(express.json());\n\nconst multerStorage = multer.memoryStorage();\n\n// Filter files with multer\nconst multerFilter = (req, file, cb) =\u003e {\n  if (file.mimetype.startsWith(\"image\")) {\n    cb(null, true);\n  } else {\n    cb(\"Not an image! Please upload only images.\", false);\n  }\n};\n\nconst upload = multer({\n  storage: multerStorage,\n  fileFilter: multerFilter,\n});\n\n// *****  Multer .fields() *****\nconst uploadProductImages = upload.fields([\n  { name: \"cover\", maxCount: 2 },\n  { name: \"gallery\", maxCount: 4 },\n]);\n\n// *****  Multer .array() *****\n// const uploadProductImages = upload.array(\"gallery\", 4);\n\n// *****  Multer .single() *****\n// const uploadProductImages = upload.single(\"cover\");\n\nconst resizerImages = async (req, res, next) =\u003e {\n  const today = new Date();\n  const year = today.getFullYear();\n  const month = `${today.getMonth() + 1}`.padStart(2, \"0\");\n\n  // Used by multer .array() or .single\n  // const filename = `gallery-${Date.now()}`;\n\n  // Used by multer .fields and filename must be same object prop\n  const filename = {\n    cover: `cover-${Date.now()}`,\n    gallery: `gallery-${Date.now()}`,\n  };\n\n  const sizes = [\n    {\n      path: \"original\",\n      width: null,\n      height: null,\n    },\n    {\n      path: \"large\",\n      width: 800,\n      height: 950,\n    },\n    {\n      path: \"medium\",\n      width: 300,\n      height: 450,\n    },\n    {\n      path: \"thumbnail\",\n      width: 100,\n      height: 250,\n    },\n  ];\n\n  const uploadPath = `./public/uploads/${year}/${month}`;\n\n  const fileUrl = `${req.protocol}://${req.get(\n    \"host\"\n  )}/uploads/${year}/${month}`;\n\n  // sharp options\n  const sharpOptions = {\n    fit: \"contain\",\n    background: { r: 255, g: 255, b: 255 },\n  };\n\n  // create a new instance of MulterSharpResizer and pass params\n  const resizeObj = new MulterSharpResizer(\n    req,\n    filename,\n    sizes,\n    uploadPath,\n    fileUrl,\n    sharpOptions\n  );\n\n  // call resize method for resizing files\n  await resizeObj.resize();\n  const getDataUploaded = resizeObj.getData();\n\n  // Get details of uploaded files: Used by multer fields\n  req.body.cover = getDataUploaded.cover;\n  req.body.gallery = getDataUploaded.gallery;\n\n  // Get details of uploaded files: Used by multer .array() or .single()\n  // req.body.cover = getDataUploaded;\n  // req.body.gallery = getDataUploaded;\n\n  next();\n};\n\nconst createProduct = async (req, res, next) =\u003e {\n  res.status(201).json({\n    status: \"success\",\n    cover: req.body.cover,\n    gallery: req.body.gallery,\n  });\n};\n\n// route for see results of uploaded images\napp.post(\"/products\", uploadProductImages, resizerImages, createProduct);\n\nconst port = 8000;\napp.listen(port, () =\u003e console.log(`app running on port ${port}...`));\n```\n\n### Outputs of above examples:\n\n```json\n// example uploading multiple files\n// result: uploaded multiple images with resizing\n{\n    \"status\": \"success\",\n    \"data\": {\n        \"gallery\": [\n            {\n                \"originalname\": \"kal-visuals-b1Hg7QI-zcc-unsplash.jpg\",\n                \"original\": {\n                    \"filename\": \"gallery-1590999763786-0-original.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/original/gallery-1590999763786-0-original.jpeg\"\n                },\n                \"large\": {\n                    \"filename\": \"gallery-1590999763786-0-large.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/large/gallery-1590999763786-0-large.jpeg\"\n                },\n                \"medium\": {\n                    \"filename\": \"gallery-1590999763786-0-medium.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/medium/gallery-1590999763786-0-medium.jpeg\"\n                },\n                \"thumbnail\": {\n                    \"filename\": \"gallery-1590999763786-0-thumbnail.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/thumbnail/gallery-1590999763786-0-thumbnail.jpeg\"\n                }\n            },\n            {\n                \"originalname\": \"lesly-juarez-RukI4qZGlQs-unsplash.jpg\",\n                \"original\": {\n                    \"filename\": \"gallery-1590999763786-1-original.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/original/gallery-1590999763786-1-original.jpeg\"\n                },\n                \"large\": {\n                    \"filename\": \"gallery-1590999763786-1-large.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/large/gallery-1590999763786-1-large.jpeg\"\n                },\n                \"medium\": {\n                    \"filename\": \"gallery-1590999763786-1-medium.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/medium/gallery-1590999763786-1-medium.jpeg\"\n                },\n                \"thumbnail\": {\n                    \"filename\": \"gallery-1590999763786-1-thumbnail.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/thumbnail/gallery-1590999763786-1-thumbnail.jpeg\"\n                }\n            },\n            ....\n        ]\n    }\n}\n\n------------------------------------------------------------------------------------------------------\n\n// example uploading single file\n// result: uploaded single image with resizing\n{\n    \"status\": \"success\",\n    \"data\": {\n        \"avatar\": [\n            {\n                \"originalname\": \"nicolas-horn-MTZTGvDsHFY-unsplash.jpg\",\n                \"original\": {\n                    \"filename\": \"profile-1590999720386-original.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/original/profile-1590999720386-original.jpeg\"\n                },\n                \"large\": {\n                    \"filename\": \"profile-1590999720386-large.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/large/profile-1590999720386-large.jpeg\"\n                },\n                \"medium\": {\n                    \"filename\": \"profile-1590999720386-medium.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/medium/profile-1590999720386-medium.jpeg\"\n                },\n                \"thumbnail\": {\n                    \"filename\": \"profile-1590999720386-thumbnail.jpeg\",\n                    \"path\": \"http://127.0.0.1:8000/uploads/2020/06/thumbnail/profile-1590999720386-thumbnail.jpeg\"\n                }\n            }\n        ]\n    }\n}\n\n\n// example uploading multer fields\n// result: uploaded image with grouping by field and resizing\n{\n    \"status\": \"success\",\n    \"cover\": [\n        {\n            \"originalname\": \"screencapture-cart-2020-04-28-11_34_35.png\",\n            \"original\": {\n                \"filename\": \"cover-1592806057900-0-original.png\",\n                \"path\": \"http://127.0.0.1:8000/uploads/2020/06/original/cover-1592806057900-0-original.png\"\n            },\n            \"large\": {\n                \"filename\": \"cover-1592806057900-0-large.png\",\n                \"path\": \"http://127.0.0.1:8000/uploads/2020/06/large/cover-1592806057900-0-large.png\"\n            },\n            \"medium\": {\n                \"filename\": \"cover-1592806057900-0-medium.png\",\n                \"path\": \"http://127.0.0.1:8000/uploads/2020/06/medium/cover-1592806057900-0-medium.png\"\n            },\n            \"thumbnail\": {\n                \"filename\": \"cover-1592806057900-0-thumbnail.png\",\n                \"path\": \"http://127.0.0.1:8000/uploads/2020/06/thumbnail/cover-1592806057900-0-thumbnail.png\"\n            }\n        },\n        ....\n    ],\n    \"gallery\": [\n        {\n            \"originalname\": \"andre-hunter-p-I9wV811qk-unsplash.jpg\",\n            \"original\": {\n                \"filename\": \"gallery-1592806057900-0-original.jpeg\",\n                \"path\": \"http://127.0.0.1:8000/uploads/2020/06/original/gallery-1592806057900-0-original.jpeg\"\n            },\n            \"large\": {\n                \"filename\": \"gallery-1592806057900-0-large.jpeg\",\n                \"path\": \"http://127.0.0.1:8000/uploads/2020/06/large/gallery-1592806057900-0-large.jpeg\"\n            },\n            \"medium\": {\n                \"filename\": \"gallery-1592806057900-0-medium.jpeg\",\n                \"path\": \"http://127.0.0.1:8000/uploads/2020/06/medium/gallery-1592806057900-0-medium.jpeg\"\n            },\n            \"thumbnail\": {\n                \"filename\": \"gallery-1592806057900-0-thumbnail.jpeg\",\n                \"path\": \"http://127.0.0.1:8000/uploads/2020/06/thumbnail/gallery-1592806057900-0-thumbnail.jpeg\"\n            }\n        },\n        ....\n    ]\n}\n```\n\n### Params\n\n```javascript\n/**\n * Constructor method\n * @param  {object} req\n * @param  {string || object} filename\n * @param  {array} sizes\n * @param  {string} uploadPath\n * @param  {string} fileUrl\n * @param  {Object} sharpOptions\n */\nconst resizeObj = new MulterSharpResizer(\n  req,\n  filename,\n  sizes,\n  uploadPath,\n  fileUrl,\n  sharpOptions\n);\n```\n\n| param        | role                                                                                                      |\n| ------------ | --------------------------------------------------------------------------------------------------------- |\n| req          | Express request object                                                                                    |\n| filename     | `String for array/single and Object{ } for multer fields` Set custom filename for storage                 |\n| sizes        | Array of objects sizes for storage image with multiple sizes                                              |\n| uploadPath   | Set custom path for storage uploaded files                                                                |\n| fileUrl      | Set url for access files with url(link)                                                                   |\n| sharpOptions | `Default: { }` , Also you can use any sharp options from [sharp.js doc](https://sharp.pixelplumbing.com/) |\n\n### Sizing structure\n\n```javascript\nconst sizes = [\n  {\n    path: \"original\",\n    width: null,\n    height: null,\n  },\n  {\n    path: \"large\",\n    width: 800,\n    height: 800,\n  },\n  {\n    path: \"medium\",\n    width: 300,\n    height: 300,\n  },\n  {\n    path: \"thumbnail\",\n    width: 100,\n    height: 100,\n  },\n];\n```\n\n| property | value                                                                |\n| -------- | -------------------------------------------------------------------- |\n| path     | Set any name of directory and suffix for storage file after uploaded |\n| width    | Set `width` for resizing                                             |\n| height   | Set `height` for resizing                                            |\n\n\u003e If `set` **`width: null`** and **`height: null`** , **The original size is saved by default**\n\n## License\n\n[MIT](https://opensource.org/licenses/MIT)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmohammadoftadeh%2Fmulter-sharp-resizer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmohammadoftadeh%2Fmulter-sharp-resizer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmohammadoftadeh%2Fmulter-sharp-resizer/lists"}