如何在文件上传中自动压缩图像

时间:2018-03-07 06:48:33

标签: javascript html angularjs ng-file-upload

在上传4MB或更大尺寸图像时,它应自动压缩不到1MB。任何人都可以告诉你如何在angularjs中做到这一点。示例文件是

JSFIDDLE



var myApp = angular.module('myApp', []);

myApp.directive('fileModel', ['$parse', function ($parse) {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            var model = $parse(attrs.fileModel);
            var modelSetter = model.assign;
            
            element.bind('change', function(){
                scope.$apply(function(){
                    modelSetter(scope, element[0].files[0]);
                });
            });
        }
    };
}]);

myApp.service('fileUpload', ['$http', function ($http) {
    this.uploadFileToUrl = function(file, uploadUrl){
        var fd = new FormData();
        fd.append('file', file);
        $http.post(uploadUrl, fd, {
            transformRequest: angular.identity,
            headers: {'Content-Type': undefined}
        })
        .success(function(){
        })
        .error(function(){
        });
    }
}]);

myApp.controller('myCtrl', ['$scope', 'fileUpload', function($scope, fileUpload){
    
    $scope.uploadFile = function(){
        var file = $scope.myFile;
        console.log('file is ' );
        console.dir(file);
        var uploadUrl = "/fileUpload";
        fileUpload.uploadFileToUrl(file, uploadUrl);
    };
    
}]);

<div ng-controller = "myCtrl">
    <input type="file" file-model="myFile"/>
    <button ng-click="uploadFile()">upload me</button>
</div>
&#13;
&#13;
&#13;

这是使用angularjs上传文件的代码。我想上传更多图片。如果我上传大小为3MB或2MB的图片,则不会显示任何消息,例如&#34;文件大小很大&#34;或者其他的东西。它应该自动压缩小于1MB,它应该上传该图像。有没有可能做到这一点使用angularjs?  这在angularjs中是否可行?

2 个答案:

答案 0 :(得分:0)

我最近使用 tinify 包为自己解决了这个问题,发现文档有些缺乏。

我有一个 Vue 前端使用 vue2dropzone 收集用户上传的文件。这些被发送到节点/Express 后端。 我需要压缩文件并将其上传到 S3 实例而不存储在磁盘上。这意味着使用多路内存存储。 因此,将无法使用 tinify.fromFile(),因为本地没有存储文件。

在我的图像中间件中:

Const multer = require(“multer”);
const tinify = require("tinify");

tinify.key = "your_key";

exports.singleFile = multer({ storage: multer.memoryStorage() }).fields([{ name: "file", maxCount: 1 }]);

exports.uploadCompImage = async (req, res, next) => {
   try {
      const fileName = `${req.params.name}${path.extname(req.files.file[0].originalname)}`;
      const source = tinify.fromBuffer(req.files.file[0].buffer);
      source.store({
         service: "s3",
         aws_access_key_id: "your_id",
         aws_secret_access_key: "your_key
         region: "your_region",
         headers: {
            "Cache-Control": "public"
         },
         path: `your_bucket/your_folder/${fileName}`
      });
      return res.status(200).send(`path_to_file/${fileName}`)
   } catch (err) {
      console.log(err);
      next(err);
   }
}

然后在我的路由文件中:

Const images = require(“../middleware/images”);

// skipped several lines for brevity

productRouter
      .route("/images/:name")
      .post(images.singleFile, images.uploadCompImage)

这个过程创建了一个multer singleFile上传到memoryStorage,使文件在req.files.file[0](req.files[“file”]因为我在multer字段中指定了“file”作为名称,循环如果上传多个,则此数组)。 设置好之后我得到了文件名,通过使用 tinify 从 req.files.file[0].buffer 作为缓冲区读取来设置源。 然后我将源设置为我的 s3 实例并发回文件的公共链接。

希望这个答案对您有所帮助。我绝对可以看到通过更改 multer 选项更改进程以更改文件的位置,甚至将其写入磁盘。

答案 1 :(得分:-1)

  

是的,Node是我的服务器

要压缩图像,请使用tinypng nodejs包

npm install --save tinify

进行身份验证

var tinify = require("tinify");
tinify.key = "YOUR_API_KEY";

压缩文件

var source = tinify.fromFile("unoptimized.jpg");
source.toFile("optimized.jpg");

您还可以从缓冲区(带二进制的字符串)上传图像并获取压缩的图像数据。

var fs = require("fs");
fs.readFile("unoptimized.jpg", function(err, sourceData) {
  if (err) throw err;
  tinify.fromBuffer(sourceData).toBuffer(function(err, resultData) {
    if (err) throw err;
    // ...
  });
});

你可以做很多其他惊人的图像处理。查看文档here