twers/re-education

View on GitHub
app/assets/javascripts/directives/openclass.jquery.fileuploader.js

Summary

Maintainability
A
2 hrs
Test Coverage
angular.module('openClass.directives')
  .directive('jqueryFileUploader',
    ['eventConstants', 'base64',
      function factory(eventConstants, base64) {

        var auth = $('[name="qiniu-request-token"]').attr('content'),
          qiniuDomain = 'http://newclass.qiniudn.com';

        function getFormData(form) {
          return [
            {
              name: "auth",
              value: auth
            },
            {
              name: "action",
              value: form.find('[name="action"]').val()
            }
          ];
        }

        function addActionFormField(form) {
          var rsput = form.find('[name="action"]');
          if (rsput.length == 0) {
            rsput = $('<input type="hidden" name="action"/>').appendTo(form);
          }
          return rsput;
        }

        function constructFiles(resultFiles) {
          var files = [];
          $(resultFiles).each(function (idx, item) {
            var baseUrl = qiniuDomain + '/' + item.name;
            files.push({
              name: item.name,
              url: baseUrl,
              mediumUrl: baseUrl + '?imageView/2/w/400',
              thumbnailUrl: baseUrl + '?imageView/2/w/200'
            });
          });
          return files;
        }

        var directive = {
          restrict: 'C',
          link: function (scope, element, attrs) {
            var uploader = $(element).fileupload({
              url: 'http://up.qbox.me/upload',
              type: 'POST',
              sequentialUploads: true,
              acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
              formData: getFormData
            });

            uploader.bind('fileuploadsubmit', function (e, data) {
              var rsput = addActionFormField(data.form),
                filename = data.files[0].name;

              rsput.val('/rs-put/' + base64.URLSafeBase64Encode('newclass:' + filename));
            });

            uploader.bind('fileuploadprogressall', function(e, data) {
              scope.$emit(eventConstants.FILE_UPLOAD_PROGRESS_ALL, {
                loaded: data.loaded,
                total: data.total,
                bitrate: data.bitrate
              });
            });

            uploader.bind('fileuploaddone', function (e, data) {
              var files = constructFiles(data.files);
              scope.$emit(eventConstants.FILE_UPLOAD_DONE, { files: files });
            });
          }
        };
        return directive;
      }]);