views:

1331

answers:

1

Hi,

I am struggling with a bit of dojo that is needed to upload a file. Now the file upload form sits within a dojo dialog box, so is hidden until the user selects an 'upload file' button.

This button can be clicked on anywhere on the site, so I've created a controller to handle the upload.

At the moment I am just trying to get it to work, and in my head script I have the following:

<?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() ?>

With the the basic upload for like this

<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>

What I would like to know is how I can get the JSON data object from /fileprocssing/loadfile/ that contains upload data information if the form is called from /somecontroller/someaction/ ?? and when the file has been processed automatically redirect to something like /fileprocesing/reviewdata/

At the moment the action that I have looks like this

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;        


}

I've handcrafted the JSON data for the time being but will use Zend_Dojo_Data but at the moment I am just trying to get this working.

I have to confess that I don't know dojo that well, but trying to get my head around it in the shortest possible time.

Thanks in advance.

+2  A: 

dojo.io.iframe.send requires the response data to be wrapped in a TEXTAREA tag. This is the only/easiest cross browser way to successfully access and load the response data, and is a requirement. It looks like you are sending plain JSON back from the action.

You can also adjust your handleAs to be "json" and skip the intermediate dojo.fromJson(data) call, it will be passed to you as a JSON object (provided the response is wrapped in the aforementioned TEXTAREA)

dante
Thanks for this... been annoying me for awhile...
Grant Collins