2012-08-02 166 views
0

我想通過我在Joomla 2.5上開發的組件來上傳文件,我需要不使用Flash而不支持HTML5瀏覽器。在Joomla 1.5上,我成功地使用了this method,但是在J2.5上傳文件後,當返回json響應,而不是上傳我的頁面時,它只顯示了joomla.json文件的下載對話框。我怎樣才能在內部iframe上成功接收json響應?Joomla 2.5 ajax文件上傳

謝謝!

編輯:這是我使用的代碼:在頁面加載後執行

showUploadImage,但元素uploadIFrame並不總是存在(當不需要上傳文件)。上傳完成應該在接收到文件名的響應時執行,但由於我嘗試修復此錯誤,此代碼從未執行,而是顯示下載joomla.json的對話框

function showUploadImage(evt) { 
     if (!document.getElementById("uploadIFrame")) { 

      return false; 

     } 

     var frame = document.getElementById("uploadIFrame"); 

     var doc = frame.contentDocument; 

     page = "\ 

       <html> \ 

        <head> \ 

         <link rel='stylesheet' href='<?php echo JRoute::_('components/com_tutorial/css/base.css',false); ?>' type='text/css' /> \ 

         <link rel='stylesheet' href='<?php echo JRoute::_('components/com_tutorial/css/upframe.css',false); ?>' type='text/css' /> \ 

        </head> \ 

        <body>"; 

     page += ' \ 

       <div id="waitimage"></div> \ 

       <form id="fileUploadForm" method="post" enctype="multipart/form-data" action="<?php echo JRoute::_('index.php?option=com_tutorial&view=editchapter&task=savechapimage&format=json&tutId='.$this->tutId.'&chapterId='.$this->chapterId); ?>" target="uploadTarget"> \ 

        <label class="title" for="images"><?php echo JText::_("UPLOAD IMAGE"); ?></label> \ 

        <div class="separator25"></div> \ 

        <div id="pageimages"> \ 

         <div id="newimgfields"> \ 

          <div class="controw"> \ 

           <label class="title" for="image"><?php echo JText::_('SELECT_FILE'); ?></label><input size="35" id="image" type="file" name="image" /> \ 

          </div> \ 

          <div class="controw"> \ 

           <input type="submit" onclick="document.getElementById(\'waitimage\').innerHTML=\'<div class = &quot;mooloader&quot;></div>\';" value="<?php echo JText::_('UPLOAD_IMAGE'); ?>" /> \ 

          </div> \ 

         </div> \ 

        </div> \ 

        <iframe id="uploadTarget" name="uploadTarget" src="" style="width:0;height:0;border:0px solid #fff;"></iframe> \ 

       </form> \ 

       '; 

     page += "</body></html>"; 

     // now write out the new contents 

     if (doc == undefined || doc == null) 

      doc = frame.contentWindow.document; 

     doc.open(); 

     doc.write(page); 

     doc.close(); 

     doc.getElementById("uploadTarget").onload = uploadDone; 

    } 



    function uploadDone() { 

     var frame = document.getElementById("uploadIFrame"); 

     var doc = frame.contentDocument; 

     var innerFrame = doc.getElementById("uploadTarget"); 

     var ret = innerFrame.contentDocument.getElementsByTagName("body")[0].innerHTML; 

     var data = eval("("+ret+")"); 

     alert(data); 

     if (data=="0"){ 

      alert("<?php echo JText::_('ERROR_SAVE_IMAGE'); ?>"); 

     } 

     else if (data=="") { 

     } 

     else { 

      var upImage = new Element('img',{ 

       'class':'tutmainthumb', 

       'id':'tutThumb', 

       'src':'components/com_tutorial/helpers/image.php?img='+data 

      }); 

      upImage.inject('tutImage','top'); 

      $('uploadIFrame').dispose(); 

     } 

    } 
+0

真的可以幫助沒有提供任何代碼。隨意使用我的SWFUpload組件。已經變得簡單以允許容易地集成到其他組件中 – Lodder 2012-08-02 00:53:10

回答

0

已解決。原來,這個響應被接收爲「Contet-type:application/json」,並且當它是「Content-Type:text/html; charset = utf-8」時,一切正常。所以錯誤不是在JavaScript上,而是在控制器中。修復它只是增加:

 header("Content-Type: text/html; charset=utf-8",true); 
     flush(); 

     echo json_encode(($imgChanging>0)?$thmbName:0); 

其中echo是發送回視圖的json消息。