0

我有一个由两个独立部分组成的项目。一方面,有一个 Rails 应用程序,另一方面,有一个带有 CakePhp 服务器的 ExtJs 客户端。

需要做的是:在 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 打开文件。

所以,问题是:出了什么问题?为什么 .docx 文件不能在 php / Cakephp 端打开?

任何想法都将受到高度赞赏。

4

1 回答 1

0

找到了答案。实际上这毕竟是某种 Cake 问题,并且与 Cake 渲染视图的方式有关。

Cakes MediaView 不允许使用远程文件,因为它构建文件路径的方式,但我添加了

$this->autoRender = false;

之后一切顺利。

这篇文章很有帮助:Corrupted .docx download using phpdocx

感谢 burzum 以及 MediaView 的提示。

于 2012-07-09T04:58:52.097 回答