2009-10-16 75 views
0

我正在努力上传文件所需的一点dojo。现在,文件上传表单位于dojo对话框中,因此在用户选择“上传文件”按钮之前隐藏。使用zend框架问题的dojo文件上传

该按钮可以在网站上的任何地方点击,所以我创建了一个控制器来处理上传。

目前我只是想获得它的工作,并在我的头上脚本我有以下几点:

<?php $this->headScript()->captureStart(); ?> 
function sendForm(){ 

    //Hide the file input field 
    dojo.style('inputField',"display","none"); 

    //Show the progress bar 
    dojo.style('progressField',"display","inline"); 
    dojo.byId('preamble').innerHTML = "Uploading ..."; 

    dojo.io.iframe.send({ 
     url: "<?php echo $this->baseUrl(); ?>/fileprocssing/loadfile/", 
     method: "post", 
     handleAs: "text", 
     form: dojo.byId('StartFrm'), 
     handle: function(data,ioArgs){ 
      var fileData = dojo.fromJson(data);     
      if (fileData.status == "success"){ 
       //Show the file input field 
       dojo.style(dojo.byId('inputField'),"display","inline"); 
       dojo.byId('fileInput').value = ''; 

       //Hide the progress bar 
       dojo.style(dojo.byId('progressField'),"display","none"); 
       dojo.byId('uploadedFiles').innerHTML += "success: File: " + fileData.details.name 
        + " size: " + fileData.details.size +"<br>"; 
       dojo.byId('preamble').innerHTML = "File to Upload: "; 
      }else{ 
       dojo.style(dojo.byId('inputField'),"display","inline"); 
       dojo.style(dojo.byId('progressField'),"display","none"); 
       dojo.byId('preamble').innerHTML = "Error, try again: "; 
      } 
     } 
    }); 
} 



<?php $this->headScript()->captureEnd() ?> 

有了基本的上传像这样

<form id="StartFrm" enctype="multipart/form-data" 
     name="cvupload" 
     action="<?php echo $this->baseUrl();?>/fileprocssing/loadfile/" 
     method="post"> 

    <input type="hidden" name="MAX_FILE_SIZE" value="500000"> 
    <!-- wrapping these in spans to be able to modify 
     parts of this form depending on what the 
     dojo.io.iframe.submit() does --> 

    <span id="preamble">File to Upload:</span><br> 
    <span id="inputField"> 
     <input type="file" id="fileInput" name="uploadFile"> 
    </span> 

    <span id="progressField" style="display:none;"> 
     <div dojoType="dijit.ProgressBar" style="width:200px" indeterminate="true"></div> 
    </span> 

    <br/> 

    <button value="upload" dojoType="dijit.form.Button" 
      onclick="sendForm()">Upload</button> 
</form> 

什么我想知道的是,如果从/ somecontroller/someaction/??调用窗体,我可以从/ fileprocssing/loadfile /中获取包含上载数据信息的JSON数据对象。当文件被自动处理重定向到类似/ fileprocesing/reviewdata/

目前,我有这个样子的

public function loadfileAction() { 

    $log = Zend_Registry::getInstance()->get('log'); 

    $log->log('in loadfileaction', Zend_Log::DEBUG); 

    $log->log($_FILES['uploadFile']['name'], Zend_Log::DEBUG); 

    $uploadedFile = array(
     'details' => $_FILES['uploadFile'], 
     'status' => 'success' 
    ); 


    $log->log($fileUploadData->toJson(), Zend_Log::DEBUG); 

    $foo = "{'status':'success',details: {name:'". 
$_FILES['uploadFile']['name']. 
"',size:". 
$_FILES['uploadFile']['size']. 
"}}"; 

    $log->log($foo, Zend_Log::DEBUG); 

    $this->view->fileData = $foo;   


} 

我手工暂时JSON数据的动作但会使用Zend_Dojo_Data,但目前我只是试图让这个工作。

我必须承认,我不知道道场那么好,但试图在最短的时间内让我的头靠近它。

在此先感谢。

回答

2

dojo.io.iframe.send要求将响应数据包装在TEXTAREA标签中。这是成功访问和加载响应数据的唯一/最简单的跨浏览器方式,并且是一项要求。它看起来像从操作中发回纯JSON。

您也可以调整你的handleAs是“JSON”,跳过中间dojo.fromJson(数据)调用,它会被传递给你作为一个JSON对象(提供的响应被包裹在上述TEXTAREA)

+0

感谢你...一直在烦我... – 2009-11-04 23:00:33