123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- (function( factory ) {
- if ( !window.jQuery ) {
- alert('jQuery is required.')
- }
- jQuery(function() {
- factory.call( null, jQuery );
- });
- })(function( $ ) {
- var Uploader = (function() {
- // -------setting-------
- // 如果使用原始大小,超大的图片可能会出现 Croper UI 卡顿,所以这里建议先缩小后再crop.
- var FRAME_WIDTH = 1600;
- var _ = WebUploader;
- var Uploader = _.Uploader;
- var uploaderContainer = $('.uploader-container');
- var uploader, file;
- if ( !Uploader.support() ) {
- alert( 'Web Uploader 不支持您的浏览器!');
- throw new Error( 'WebUploader does not support the browser you are using.' );
- }
- // hook,
- // 在文件开始上传前进行裁剪。
- Uploader.register({
- 'before-send-file': 'cropImage'
- }, {
- cropImage: function( file ) {
- var data = file._cropData,
- image, deferred;
- file = this.request( 'get-file', file );
- deferred = _.Deferred();
- image = new _.Lib.Image();
- deferred.always(function() {
- image.destroy();
- image = null;
- });
- image.once( 'error', deferred.reject );
- image.once( 'load', function() {
- image.crop( data.x, data.y, data.width, data.height, data.scale );
- });
- image.once( 'complete', function() {
- var blob, size;
- // 移动端 UC / qq 浏览器的无图模式下
- // ctx.getImageData 处理大图的时候会报 Exception
- // INDEX_SIZE_ERR: DOM Exception 1
- try {
- blob = image.getAsBlob();
- size = file.size;
- file.source = blob;
- file.size = blob.size;
- file.trigger( 'resize', blob.size, size );
- deferred.resolve();
- } catch ( e ) {
- console.log( e );
- // 出错了直接继续,让其上传原始图片
- deferred.resolve();
- }
- });
- file._info && image.info( file._info );
- file._meta && image.meta( file._meta );
- image.loadFromBlob( file.source );
- return deferred.promise();
- }
- });
- return {
- init: function( selectCb ) {
- uploader = new Uploader({
- pick: {
- id: '#filePicker',
- multiple: false
- },
- // 设置用什么方式去生成缩略图。
- thumb: {
- quality: 70,
- // 不允许放大
- allowMagnify: false,
- // 是否采用裁剪模式。如果采用这样可以避免空白内容。
- crop: false
- },
- // 禁掉分块传输,默认是开起的。
- chunked: false,
- // 禁掉上传前压缩功能,因为会手动裁剪。
- compress: false,
- // fileSingleSizeLimit: 2 * 1024 * 1024,
- server: '../server/fileupload.php',
- swf: '../Uploader.swf',
- fileNumLimit: 1,
- onError: function() {
- var args = [].slice.call(arguments, 0);
- alert(args.join('\n'));
- }
- });
- uploader.on('fileQueued', function( _file ) {
- file = _file;
- uploader.makeThumb( file, function( error, src ) {
- if ( error ) {
- alert('不能预览');
- return;
- }
- selectCb( src );
- }, FRAME_WIDTH, 1 ); // 注意这里的 height 值是 1,被当成了 100% 使用。
- });
- },
- crop: function( data ) {
- var scale = Croper.getImageSize().width / file._info.width;
- data.scale = scale;
- file._cropData = {
- x: data.x1,
- y: data.y1,
- width: data.width,
- height: data.height,
- scale: data.scale
- };
- },
- upload: function() {
- uploader.upload();
- }
- }
- })();
- var Croper = (function() {
- var container = $('.cropper-wraper');
- var $image = container.find('.img-container img');
- var btn = $('.upload-btn');
- var isBase64Supported, callback;
- $image.cropper({
- aspectRatio: 16 / 9,
- preview: ".img-preview",
- done: function(data) {
- // console.log(data);
- }
- });
- function srcWrap( src, cb ) {
- // we need to check this at the first time.
- if (typeof isBase64Supported === 'undefined') {
- (function() {
- var data = new Image();
- var support = true;
- data.onload = data.onerror = function() {
- if( this.width != 1 || this.height != 1 ) {
- support = false;
- }
- }
- data.src = src;
- isBase64Supported = support;
- })();
- }
- if ( isBase64Supported ) {
- cb( src );
- } else {
- // otherwise we need server support.
- // convert base64 to a file.
- $.ajax('../server/preview.php', {
- method: 'POST',
- data: src,
- dataType:'json'
- }).done(function( response ) {
- if (response.result) {
- cb( response.result );
- } else {
- alert("预览出错");
- }
- });
- }
- }
- btn.on('click', function() {
- callback && callback($image.cropper("getData"));
- return false;
- });
- return {
- setSource: function( src ) {
- // 处理 base64 不支持的情况。
- // 一般出现在 ie6-ie8
- srcWrap( src, function( src ) {
- $image.cropper("setImgSrc", src);
- });
- container.removeClass('webuploader-element-invisible');
- return this;
- },
- getImageSize: function() {
- var img = $image.get(0);
- return {
- width: img.naturalWidth,
- height: img.naturalHeight
- }
- },
- setCallback: function( cb ) {
- callback = cb;
- return this;
- },
- disable: function() {
- $image.cropper("disable");
- return this;
- },
- enable: function() {
- $image.cropper("enable");
- return this;
- }
- }
- })();
- var container = $('.uploader-container');
- Uploader.init(function( src ) {
- Croper.setSource( src );
- // 隐藏选择按钮。
- container.addClass('webuploader-element-invisible');
- // 当用户选择上传的时候,开始上传。
- Croper.setCallback(function( data ) {
- Uploader.crop(data);
- Uploader.upload();
- });
- });
- });
|