2012-07-16 1 views
3

프로젝트 작업 중이며 s3에 파일을 업로드해야합니다. 여기 내 코드는 다음과 같습니다.Plupload Thumbnail

config = $.extend(Photo.Plupload.config, config); 
var uploader = new plupload.Uploader({ 
      runtimes:'flash,silverlight', 
      browse_button:config.select_button, 
      max_file_size:config.max_file_size, 
      url:'http://' + Photo.Album.Form.bucket + '.s3.amazonaws.com/', 
      flash_swf_url:'/assets/plupload/js/plupload.flash.swf', 
      silverlight_xap_url:'/assets/plupload/js/plupload.silverlight.xap', 
      init:{ 
       FilesAdded:function (up, files) { 
        /*plupload.each(files, function (file) { 
        if (up.files.length > 1) { 
        up.removeFile(file); 
        } 
        }); 
        if (up.files.length >= 1) { 
        $('#' + config.select_button).fadeOut('slow'); 
        }*/ 
       }, 
       FilesRemoved:function (up, files) { 
        /*if (up.files.length < 1) { 
        $('#' + config.select_button).fadeIn('slow'); 
        }*/ 
       } 
      }, 
      multi_selection:true, 
      multipart:true, 
      multipart_params:{ 
       'key':config.key + '/${filename}', 
       'Filename':'${filename}', // adding this to keep consistency across the runtimes 
       'acl':config.acl, 
       'Content-Type':config.content_type, 
       'success_action_status':'201', 
       'AWSAccessKeyId':Photo.Album.Form.access_key_id, 
       'policy':Photo.Album.Form.policy, 
       'signature':Photo.Album.Form.signature 
      }, 
      filters:[ 
       { 
        title:config.filter_title, 
        extensions:config.filter_extentions 
       } 
      ], 
      file_data_name:'file' 
     }); 

     // instantiates the uploader 
     uploader.init(); 

     // shows the progress bar and kicks off uploading 
     uploader.bind('FilesAdded', function (up, files) { 
      // add pseudofile to the sheet 
      console.log(files); 
      $.each(files, function (index, value) { 
       value.name = "thumb_" + value.name; 
      }); 
      console.log(files); 
      console.log(up); 
      uploader.start(); 
     }); 

     // binds progress to progress bar 
     uploader.bind('UploadProgress', function (up, file) { 
      /*if (file.percent < 100) { 
      $('#progress_bar .ui-progress').css('width', file.percent + '%'); 
      } 
      else { 
      $('#progress_bar .ui-progress').css('width', '100%'); 
      $('span.ui-label').text('Complete'); 
      }*/ 
     }); 

     // shows error object in the browser console (for now) 
     uploader.bind('Error', function (up, error) { 
      // unfortunately PLUpload gives some extremely vague 
      // Flash error messages so you have to use WireShark 
      // for debugging them (read the README) 

      alert('Что-то непонятное произошло. Firebug в помощь.'); 
      console.log('Expand the error object below to see the error. Use WireShark to debug.'); 

      console.log(error); 
     }); 

     // when file gets uploaded 
     uploader.bind('FileUploaded', function (up, file) { 
      //console.log(up); 
      //console.log(file); 
      // save file location in the database 
      Photo.Album.Form.post(file) 
      up.refresh(); 
     }); 

코드가 작동합니다. S3에 파일을 업로드하고 서버가 처리 할 수 ​​있도록 보내는 유효한 응답을받습니다. 이미지 클라이언트 크기 조정도 작동합니다.

내가 지금하려는 것은 원본 파일과 함께 서버에 미리보기 이미지를 보내는 것입니다. 필자가 아는 한, plupload 초기화 프로그램에 여러 크기 조정 옵션을 입력 할 수 없습니다. 원본 파일뿐만 아니라 크기가 조정 된 버전이 S3로 전송되도록하려면 어떻게해야합니까? Amazon에서 파일 크기를 직접 조절할 수 있습니까?

파일을 다운로드하고 서버 크기를 조정하여 다른 해상도로 다시 업로드하는 옵션을 피하려고합니다.

미리 감사드립니다.

답변

3

더 나은 해결 방법은 처리기에서 QueueChanged을 트리거 한 다음 refresh을 호출하는 것입니다. 이렇게하면 동일한 파일에 대한 업로드가 다시 시작되고 파일 크기를 조정하기 위해 BeforeUpload 처리기에서 읽은 속성을 설정할 수 있습니다.

경고 # 1 : 큰 이미지 다음에 미리보기 이미지를 업로드해야합니다. 그렇지 않으면 전체 크기 이미지에 약간의 버퍼 문제가있어 잘릴 수 있습니다.

경고 # 2 : FileUploadedbind 호출이 uploader.init() 이후에 발생하는 경우에만 그렇지 않으면 FileUploaded에 대한 업 로더 자신의 핸들러는 핸들러 후 DONE 다시 file.status을 덮어 쓰게됩니다 작동합니다.

uploader.bind('BeforeUpload', function(up, file) { 
    if('thumb' in file) 
     up.settings.resize = {width : 150, height : 150, quality : 100}; 
    else 
     up.settings.resize = {width : 1600, height : 1600, quality : 100}; 
} 

uploader.bind('FileUploaded', function(up, file) { 
    if(!('thumb' in file)) { 
     file.thumb = true; 
     file.loaded = 0; 
     file.percent = 0; 
     file.status = plupload.QUEUED; 
     up.trigger("QueueChanged"); 
     up.refresh(); 
    } 
} 
1

누군가가 관심이있는 경우를 대비하여이 문제에 대한 해결책 (임시 해결책 일 가능성이 있음)을 발견했습니다.

 uploader.bind('UploadComplete', function (up, files) { 
     console.log(uploader); 
      // renew the file object 
      if (config.complete == true) { 
       // remove all files 
       files = []; 
       up.settings.multipart_params.key = config.key + '/${filename}'; 
       up.settings.resize = null; 
      } else { 
       up.settings.multipart_params.key = config.key + '/thumbs/${filename}'; 
       up.settings.resize = {width:100, height:100}; 
       $.each(files, function(index, value){ 
        value.percent = 0; 
        value.status = 1; 
       }); 
       config.complete = true; 
       up.start(); 
      } 
     }); 

그래서, 1. 당신은 세마포어 변수 "완전는"처음에 거짓합니다. 2. 완료하지 않은 경우 -> 축소판을 생성하고 plupload를 다시 시작하도록 설정을 변경하십시오. 완료를 true로 설정하십시오. 3. 완료되면 -> 파일 대기열을 비우고 설정을 다시 설정하십시오.

추악하지만 일을합니다. 나는 아직도 더 나은 해결책을 찾고있다.