2016-11-29 2 views
1

동적으로 생성 된 여러 개의 드롭 존에서 업로드를 처리하기 위해 plupload의 단일 인스턴스를 사용하는 프로젝트에서 작업하고 있습니다. Smarty 템플릿, jQuery 및 PHP를 사용합니다. 일단 애플리케이션을 호스팅하는 서버로의 업로드가 성공하면 문서 전송이 발생하고 AWS로 문서를 전송하기 때문에 프로세스 전체에서 이월해야하는 두 가지 속성이 있습니다. 나는 plupload를 통해 초기 업로드 중에 필 요한 애트리뷰트를 수집 할 수있는 방법을 이해하기 위해 고심하고있다. 현재 파일은 로컬 서버에 잘 업로드됩니다.Plupload : 여러 동적 드롭 존의 데이터 속성을 가져옵니다.

내가 필요한 것은 행의 ID와 놓은 행의 데이터 유형 속성을 얻는 것입니다. 개찰에서는 속성 id={$doc.id}data-type={$doc.id}을 볼 수 있습니다. 이것들은 내가 수집해야 할 속성들이다. 나는 사람들을 수집하는 방법을 이해하면

<?php 
session_start(); 
require_once(dirname(dirname(__DIR__)).'/sites/site_settings.php'); 

//Output passed values from plUpload 
/*$fh = fopen("./request.txt",'w'); 
fwrite($fh, "Request Dump\n"); 
fwrite($fh, print_r($_REQUEST, true)); 
fwrite($fh, "\n\nPost Dump\n"); 
fwrite($fh, print_r($_POST, true)); 
fwrite($fh, "\n\nGET Dump\n"); 
fwrite($fh, print_r($_GET, true)); 
fwrite($fh, "\n\nServer Dump\n"); 
fwrite($fh, print_r($_SERVER, true)); 
fwrite($fh, "\n\nFiles Dump\n"); 
fwrite($fh, print_r($_FILES, true)); 
fclose($fh);*/ 

if($_SERVER['REQUEST_METHOD'] == "POST") 
{ 
    if(! empty($_FILES['file'])) 
    { 
     if($_FILES['file']['error'] === UPLOAD_ERR_OK) 
     { 
      $path_info = pathinfo($_FILES['file']['name']); 
      $file_extension = strtolower($path_info["extension"]); 
      $extension_whitelist = array("pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx"); 
      $doc_fk = $_FILES['file']['doc_fk']; 
      if(in_array($file_extension, $extension_whitelist)) 
      { 
       try 
       { 
        $url = ADMIN_URL."/documents/temp/"; 
        $path = ADMIN_PATH."/documents/temp/"; 
        $fname = cleanFilename($_FILES['file']['name']); 
        if(move_uploaded_file($_FILES["file"]["tmp_name"], $path.$fname)) 
         $ret = array("error" => 0, "path" => $url, "givenName" => $_FILES['file']['name'], "storedName" => $fname, "ext" => $file_extension, "doc_fk" => $doc_fk); 
        else 
         $ret = array("error" => 1, "error_msg" => "Failed to Upload File to System"); 
       } 
       catch(Exception $e) 
       { 
        $ret = array("error" => 1, "error_msg" => $e->getMessage()); 
       } 
      } 
      else 
       $ret = array("error" => 1, "error_msg" => "Invalid file type: $file_extension. File must be PDF, Word Document, Excel Spreadsheet or a PowerPoint Presentation."); 
     } 
     else 
      $ret = array("error" => 1, "error_msg" => "Upload Error Occurred"); 
    } 
} 
else 
    $ret = array("error" => 1, "error_msg" => "Failed POST check: ".$_SERVER[REQUEST_METHOD]); 

echo json_encode($ret); 

?> 

:

var dom = { uploader: $("#dropbox"), 
      uploads: $("ul.doc_list_container"), 
      dropzones: $("li.doc_list_row") 
}; 

uploader = new plupload.Uploader({ 
    runtimes : "html5,silverlight,html4", 
    browse_button : "file-pick", 
    container : "file-cntr", 
    max_file_zie : '10mb', 
    url : "../upload.php", 
    drop_element: "dropbox", 
    filters : {title : "Text Files", extensions : "pdf, doc, docx, xls, xlsx, ppt, pptx"}, 
    init: { 
     FilesAdded: function(up, files){ up.start(); $("#file-upld-progress").fadeIn(300); }, 
     UploadProgress: function(up, file){ $("#file-upld-progress").text(file.percent + "%"); }, 
     UploadComplete: function(up, file) { $("#file-upld-progress").fadeOut(300, function(){ setTimeout(function(){ $("#file-upld-progress").text(''); }, 2500); }); }, 
     FileUploaded: function(up, file, resp, src) { uploadHandler(resp.response, src); }, 
     Error: function(up, err) { showFormMsg("alert-error", "File Upload Error #" + err.code + ": " + err.message); } 
    }, 
    multipart: true, 
    multipart_params : {} 
}); 

uploader.bind("BeforeUpload", handlePluploadBeforeUpload); 
uploader.bind("PostInit", handlePluploadInit); 
uploader.bind("FilesAdded", handlePluploadFilesAdded); 
uploader.init(); 
uploader.bind("FileUploaded", function(up, file, resp) { uploadHandler(resp.response); }); 

var fileType = ''; 
dom.dropzones.each(function(){ 
    var dropzone = new mOxie.FileDrop({ 
     drop_zone: $(this).attr('id') 
    }); 

    dropzone.ondrop = function(e){ 
     uploader.addFile(this.files); 
     // fileType = $(this); 
    }; 

    dropzone.init(); 

    var input = new mOxie.FileInput({ 
     browse_button: $("#file-pick")[0], 
     container: this, 
     multiple: true 
    }); 

    input.onchange = function(e){ 
     uploader.addFile(input.files); 
    }; 

    input.init() 
}); 

function handlePluploadBeforeUpload(uploader, file) { 
    params = uploader.settings.multipart_params; 
    var source = file.getSource(); 
    // console.log(source); 
    // console.log(params.docType); 
} 


function handlePluploadInit(uploader, params){ 
    // console.log("Initialization complete."); 
    // console.log("Drop-drop supported:", !! uploader.features.dragdrop); 
} 

function handlePluploadFilesAdded(uploader, files) { 
    for (var i = 0 ; i < files.length ; i++) { 
     files[i].docType = $(this).data('type'); 
    } 
} 

그리고 upload.php로 :

여기
{foreach $document_set as $doc} 
    <li id="file-{$doc.id}" class="doc_list_row" data-type="{$doc.id}"> 
     <div class="row doc_list_row"> 
      <div class="col-sm-12" style="color: #fff"> 
       <div class="row"> 
        <div class="col-sm-12 doc_list_title"> 
         <h4>{$doc.name}</h4> 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col-sm-8"> 
        <div class="row"> 
         <div class="col-sm-8 padtop-10"> 
          <p>{$doc.description}</p> 
         </div> 
        </div> 
        <div class="row file_details_row"> 
         <div class="col-sm-6"> 
          <h4>Created On:</h4> 
          <p>{$doc.created}</h4> 
         </div> 
         <div class="col-sm-6"> 
          <h4>Created By:</h4> 
          <p>{$doc.created_by}</p> 
         </div> 
        </div> 
        <div class="row file_details_row"> 
         <div class="col-sm-6"> 
          <h4>Updated On:</h4> 
          <p>{$doc.last_update}</h4> 
         </div> 
         <div class="col-sm-6"> 
          <h4>Updated By:</h4> 
          <p>{$doc.last_update_by}</p> 
         </div> 
        </div> 
       </div> 
       <div class="col-sm-4 mng_file_icon_container"> 
        <div class="row"> 
         <div id="dl-{$doc.id}" class="col-xs-6 col-sm-6 dl_icon" data-filename="fileURLWillGoHere"> 
          <div id="dl_circle-{$doc.id}" class="dl_circle circle"> 
           <div class="triangle-down"> 
           </div> 
           <h3 class="dl_version">V.{$doc.version_depth}</h3> 
          </div> 
         </div> 
         <div class="col-xs-6 col-sm-6 upld_icon" data-toggle="modal" data-target="#upld_file_modal"> 
         <div id="upld_circle-{$doc.id}" class="upld_circle circle"> 
          <div class="triangle-up"> 
          </div> 
          <h3 class="upld_version">V.{$doc.version_depth + 1}</h3> 
          </div> 
         </div> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
</li> 
{/foreach} 

이 핸드 오프를 처리 할 수있는 jQuery를 수 있습니다 : 여기에 폼의 마크 업입니다 두 가지 속성을 통해 프로젝트의이 부분을 완료하면서 앞으로 나아갈 수있을 것입니다. 이것은 마지막 전화 끊기이며 다양한 GitHub 기사와 SO 스레드를 따라 몇 시간의 시행 착오를 겪었습니다. 나는 또한 plupload의 포럼을 언급했으며 우리가 여기에서하는 것과 아주 비슷한 것을 발견하지 못했다. TIA에 도움이 필요해!

+0

안녕하세요 톰, 저도 같은 문제로 고민하고 있습니다. 이 문제를 해결해 봤어? 어떻게 든 div의 가치를 떨어 뜨릴 필요가 있습니다. – jmchauv

+0

안녕하세요 @ jmchauv 저는 정말로했습니다. 잠시만 기다려주세요. 구현 방법을 다루는 코드를 게시 할 것입니다. 코드는 상황에 따라 다르므로 상급 개발자가 최종 결정을 내리는 데 도움이되었지만 올바른 방향으로 인도해야합니다. – TomJ

답변

0

이 시나리오에서 우리는 유스 케이스를 위해 해결책을 찾았습니다. jQuery를 사용하여 일련의 업 로더를 만듭니다. 동적으로 생성 된 업 로더의 ID가 저장됩니다. 그런 다음 잠재적 인 각 업 로더에 대해 새로운 업 로더를 인스턴스화합니다. doc_list_row 클래스에서 반복을 고려하면 각 목록 행의 개별 ID를 가져 와서 drop_element에 배치 할 수 있습니다.

나머지는 여기에서 본질적으로 일반적인 plupload 인스턴스와 동일합니다. 단순히 uploadHandler 함수를 참조 용으로 포함 했으므로 업로드 성공을 다르게 처리 할 필요는 없습니다. 똑똑한 템플릿과 xajax를 사용한다는 점에 유의하십시오. 따라서 표준 아약스 또는 PHP 이외의 다른 언어를 사용하여 백엔드에 사용할 경우이 코드 중 일부는 직접 작동하지 않습니다! 비슷한 상황에있는 다른 사람들이이 사용 사례를 극복하기가 어려워서 다음 단계를 이해할 수 있기를 바랍니다.

jQuery를

/******************************************************************************* 
* 
* Upload Document 
* 
* 
*******************************************************************************/ 
function initUploaders(){ 
    if($("li.doc_list_row").length){ 
     upldrs = new Array(); 
      $("li.doc_list_row").each(function(){ 
       upld = new plupload.Uploader({ 
       runtimes : "html5", 
       url : "upload.php", 
       dragdrop: true, 
       drop_element : $(this).attr("id"), 
       browse_button : $(this).find("div.upld_icon").attr("id"), 
       filters: { 
        max_file_size : '10mb',   
        mime_types: [{title : "Scan Files", extensions : "pdf,jpg,jpeg,png,xls,xlsx,doc,docx"}] 
       }, 
       multipart_params : {DOC_ID: $(this).attr("data-doc")}, 
       init: { 
        // FilesAdded: function(up, files){ up.start(); }, 
        FilesAdded: function(up, files){ up.start(); showProgressBar(up); }, 
        UploadProgress: function(up, file){ $(".upld-progress").css("width", file.percent + "%"); }, 
        UploadComplete: function(up, file) { hideProgressBar();  }, 
        FileUploaded: function(up, file, resp) { uploadHandler(resp.response); }, 
        Error: function(up, err) { showFormMsg("alert-error", "File Upload Error #" + err.code + ": " + err.message); } 
       } 
      }); 
      upld.init(); 
      upldrs.push(upld); 
     }); 
    } 
} 


/******************************************************************************* 
* 
* Response handler for plupload 
* 
* 
*******************************************************************************/ 
function uploadHandler(resp){ 
    var r = $.parseJSON(resp); 
    if(r.error) 
     showFormMsg("alert-danger", "Upload Error: " + r.error_msg); 
    else{ 
     var elemId = $(upld.settings.drop_element[0]).attr('id').split('-'); 
     showFormMsg('alert-success', 'Upload successful.'); 
     xajax_paginate(currentPage(), currentDept(), $("#filter-doc-category").val(), $("#search_doc_name-id").val().trim(), $("#search_publisher_name-id").val().trim()); 
     $("#file-"+elemId).find('.unavail_dl_icon').removeClass('unavail_dl_icon').addClass('dl_icon'); 
    } 
} 

HTML

{if $documents_set|default:0} 
{foreach $documents_set as $doc} 
<li id="file-{$doc.id}" class="doc_list_row" data-doc="{$doc.id}" data-ondeck="0" data-default="{$doc.name}"> 
    <div class="row doc_list_row"> 
     <div class="col-sm-8"> 
      <div class="row"> 
       <div class="col-sm-12 doc_list_title"> 
        <div class="col-sm-3"><h4>{$doc.name}</h4></div> 
         <div class="col-sm-4" style="padding-top: 15px; margin-bottom: 0;"> 
         <div id="doc-upld-bar-{$doc.id}" class="progress upld-progress"> 
         <div class="progress-bar progress-bar-success progress-bar-striped active" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:100%"></div> 
        </div> 
       </div> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="col-sm-8"> 
       <div class="row"> 
        <div class="col-sm-8 padtop-10"> 
         <p>{$doc.description}</p> 
        </div> 
       </div> 
       <div class="row file_details_row"> 
        <div class="col-sm-6"> 
         <h4>Last Update:</h4> 
         <p>{$doc.lastUpdate}</p> 
        </div> 
        <div class="col-sm-6"> 
         <h4>Last Update By:</h4> 
         <p>{$doc.last_update_by}</p> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
    <div class="col-sm-4"> 
     <div class="row"> 
      <div class="col-sm-12 mng_file_icon_container"> 
       <div id="dl-{$doc.id}" class="col-xs-6 col-sm-6 {if $doc.file_list|default:''}dl_icon{else}unavail_dl_icon{/if}" data-doc="{$doc.id}"> 
        <!-- This is the selector --> 
        {if $doc.file_list|default:''} 
        <select id="version-selector-{$doc.id}" class="available_versions"> 
         {foreach $doc.file_list as $f}<option value="{$f}">{if [email protected]}Current{else}{[email protected]} Previous{/if}</option>{/foreach} 
        </select> 

        <div id="dl_circle-{$doc.id}" class="dl_circle circle" data-for="{$doc.file}"> 
        <div class="triangle-down"> 
        </div> 
       </div> 
       {else} 
       <select class="no_file" DISABLED> 
        <option>No File</option> 
       </select> 
       <div id="unavail_dl" class="unavail_dl_circle circle"> 
       <div class="unavail_triangle"> 
       </div> 
       </div> 
       {/if} 
      </div> 
      <div id="upld-{$doc.id}" class="col-xs-6 col-sm-6 upld_icon"> 
      <div id="upld_circle-{$doc.id}" class="upld_circle circle"> 
       <div class="triangle-up"> 
       </div> 
      </div> 
     </div> 
    </div> 
      </div> 
     </div> 
    </div> 
</li> 
{/foreach}