2012-07-05 71 views
0

我有一個由兩個獨立部分組成的項目。一方面,有一個Rails應用程序,另一方面,還有一個帶CakePhp服務器的ExtJs客戶端。在Rails中附加文件並在ExtJs + CakePHP中讀取它們

需要發生的事情是:在Rails中附加一個文件(這是通過使用Paperclip完成的)並且能夠在Cake端讀取它們。如果兩個系統都在同一臺服務器上,這可能很容易,但是這需要遠程完成,所以Cake端將調用Rails路由並且Rails將提供該文件。

蛋糕代碼來下載文件:

function download_file($path, $file_name, $content_type, $size) { 
    if ($fd = fopen ($path, "r")) { 
     header("Content-type: " . $content_type); 
     header("Content-Disposition: attachment; filename=\"".$file_name."\""); 
     header("Content-length: $size"); 
     header("Cache-control: private"); //use this to open files directly 
     header('Pragma: public'); 
     ob_clean(); 
     flush(); 
     echo readfile($path); 
     // $this->log(apache_response_headers(), 'debug'); 
    } 
    fclose ($fd); 
} 

的Ruby/Rails代碼來提供文件:

send_file document.path, :type => document.document_content_type 

Rails的文檔模型:如預期

class Document < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 

    has_attached_file :document, 
     :url => '/download/:id/:fingerprint/documents' 

    def path 
     document.path 
    end 
end 

一切正常,除了一個類型文件,.docx。我可以上傳,然後下載除此類型以外的其他任何文件。上傳後,我可以在rails中讀取該文件,沒有問題。 Cake端看起來有些問題,因爲發生這種情況的原因是:我可以下載該文件,但之後我無法使用LibreOffice打開它。我似乎將mime類型正確設置爲apache,並且瀏覽器識別文件的類型以及打開它的應用程序。看來我可以用TextEdit打開文件。

所以,問題是:什麼是錯的?爲什麼在php/CakePHP端不打開.docx文件?

任何想法將不勝感激。

+0

爲什麼你不使用CakePHP媒體視圖呢?實際上,您的整個方法完全沒有CakePHP。 :)嘗試媒體類,看看它是否與框架核心的單元測試代碼一起工作。 – burzum 2012-07-06 00:23:10

回答

0

找到了答案。事實上,這畢竟是某種Cake的問題,它與Cake呈現視圖的方式有關。

蛋糕MediaView不允許使用的,因爲它建立的文件的路徑的方式遠程文件的工作,但我已經添加了

$this->autoRender = false; 

,一切之後順利。

這篇文章是有幫助的:Corrupted .docx download using phpdocx

由於BURZUM以及與MediaView提示。

相關問題