【问题标题】:automatic Image resizing for every uploaded images by users为用户上传的每张图片自动调整图片大小
【发布时间】:2021-05-14 00:58:48
【问题描述】:

我有一个允许用户上传大量图片的网络应用程序,我的目标是通过缩小用户上传的图片大小来减少 AWS 向我收取的托管费用,

目前我使用简单的Js将限制设置为1MB,我不是真正的前端开发人员,那么创建一个自动缩小图像大小的javascript解决方案有多难?这很容易做到吗?

如果不是,那我的另外两个选项是Django和AWS UI,后端是Django,但是Django只有到达后端才能处理图像,那么如果发生这种情况,我的aws成本会增加吗?

最后是 AWS 解决方案,我还不知道怎么做,也许使用一个叫做 lambda 的东西?它是完全免费的吗?如果它可以降低我的成本并且易于设置,那么就是这样?

还是只使用简单的 javascript 是否明智?这很容易实现吗?比如复制粘贴不到50行代码就自动解决了?

【问题讨论】:

  • “完全免费吗?” - 不,不是。
  • @Marcin,但重点是降低成本,如果 aws 不是免费的,那么我有什么选择? Javascript?几行js代码就可以轻松搞定吗?
  • Lambda 将是首选考虑,但它的价格取决于您处理多少图像,这些图像有多大,处理图像需要多长时间,您需要多少内存,等等。您的问题中没有提供这些信息。这是唯一的猜测。
  • @Marcin 好吧......但它不是免费的,我的意思是降低成本,我不想支付大笔账单,如果 javascript 或 django 后端可以免费做到这一点那为什么要使用 lambda
  • 归根结底,AWS 没有什么是免费的。您可能有一些折扣或一些“免费等级”免费使用片刻。使用 lambda 的成本(如果有的话)可能会被较小的 s3 存储费用、传出流量等补偿。只有您知道您的应用程序是什么以及存储图像的成本等。

标签: javascript jquery django amazon-web-services aws-lambda


【解决方案1】:

【讨论】:

  • 好像涉及到npm包,看起来挺复杂的,我对js不是很熟悉,可以用简单的javascript或者jquery来做吗?
【解决方案2】:

这是一个基于我的评论的工作示例:

/**
 * Resize a base 64 Image
 * @param {String} base64 - The base64 string (must include MIME type)
 * @param {Number} newWidth - The width of the image in pixels
 * @param {Number} newHeight - The height of the image in pixels
 */

const toBase64 = file => new Promise((resolve, reject) => {
  const reader = new FileReader();
  reader.readAsDataURL(file);
  reader.onload = () => resolve(reader.result);
  reader.onerror = error => reject(error);
});

async function Main() {
  const file = document.querySelector('.file').files[0];
  const newFile = await toBase64(file);

  document.body.append("Before: ");
  let before = document.createElement("img");
  before.src = newFile;
  document.body.appendChild(before);

  resizeBase64Img(newFile, 200, 200).then(resized => {
    let img = document.createElement("img");
    img.src = resized;
    document.body.appendChild(img);
  });
}

function resizeBase64Img(base64, newWidth, newHeight) {
  return new Promise((resolve, reject) => {
    var canvas = document.createElement("canvas");
    canvas.style.width = newWidth.toString() + "px";
    canvas.style.height = newHeight.toString() + "px";
    let context = canvas.getContext("2d");
    let img = document.createElement("img");
    img.src = base64;
    img.onload = function() {
      context.scale(newWidth / img.width, newHeight / img.height);
      context.drawImage(img, 0, 0);
      resolve(canvas.toDataURL());
    }
  });
}

document.querySelector(".file").addEventListener("input", Main);
<input class="file" type="file">

【讨论】:

  • 我不完全理解你的代码,调整大小部分确实有效,但它不能替换正在上传的图像文件,我需要添加什么才能替换上传的图像文件使用新调整大小的图像
  • 您是如何上传文件的?数据网址?
  • .............它是上传图片的基本html方式,一个按钮说上传图片,用户点击它然后选择他想要的图片通过 django 生成的表单上传
  • 所以你在使用 Ajax?
  • 不,我想知道 Django 是如何与前端连接的,我从来没有写过任何 ajax 代码
猜你喜欢
  • 2019-10-09
  • 2014-04-29
  • 1970-01-01
  • 2018-12-02
  • 2012-05-28
  • 2011-08-25
  • 2014-08-26
  • 2011-05-28
  • 1970-01-01
相关资源
最近更新 更多