为什么我的docx,xl​​sx,pptx文件损坏?

问题:

我需要对服务器上的文件进行加密,对于.txt,.doc,.xls,.ppt而言,这些文件完全正常,但对于.docx,.xlsx和.pptx不起作用。

当我尝试编辑docx(或xlsx,pptx)时,问题在于该文件因我加密/解密的方式而受到损坏,因为它不是编辑docx的正确方法。 所以,当Microsoft Word试图打开它,它说它已损坏,它打开它作为'Document1.docx',而不是'MyFileName.docx',当保存时,我必须再次给出名称和pptx我甚至不得不给文档所在的webdav文件夹的路径。

题 :

有没有办法让它保存在正确的位置而不必键入路径?

CODE:

这里是我用来加密文件的代码:

$ext = explode( '.', basename($path));
if (in_array("doc", $ext) || in_array("docx", $ext)) {
    $handle = fopen("$davPath/$path", "rb");
    $data_file = fread($handle, filesize("$davPath/$path"));
    fclose($handle);
} else {            
    $data_file = file_get_contents("$davPath/$path");
}

$encrypt_data_file = $encryption->encrypt($data_file);

if (file_put_contents("$davPath/encrypt_" . basename($path),$encrypt_data_file)) {
    unlink("$davPath/" . basename($path));
    rename("$davPath/encrypt_" . basename($path),"$davPath/" . basename($path));
    return true;
} else {
    return false;
}

这里是我用来解密它们的代码:

$ext = explode( '.', basename($uri));
if(is_file($davPath."/".$uri)) {
    if (in_array("doc", $ext) || in_array("docx", $ext)) {
        $handle = fopen("$davPath/$uri", "rb");
        $data_file = fread($handle, filesize("$davPath/$uri"));
        fclose($handle);
    } else {
        $data_file = file_get_contents("$davPath/$uri");
    }   
}
if ($data_file != false) {
    $decrypt_data_file = $encryption->decrypt($data_file);

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($uri));
    header('Content-Location: '.$_SERVER['SCRIPT_URI']);
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    ob_clean();
    flush();
    echo $decrypt_data_file;
    return false;
}

PS:我找到了一种解决方法,包括在修改过程中在服务器上解密文件,但我真的不希望这样做。


你的问题已经解决,但我想添加一个答案。

当你有一个损坏的docx,这里有一些步骤来找出什么是错的:

首先,尝试解压zip。 如果它确实起作用,那么问题在于docx的内容。 如果解压缩不起作用,则您的压缩文件似乎已损坏

与docx的内容有关的问题

当你打开docx时,单词可能会告诉你问题在哪里,如果zip没有损坏。

它会告诉你,例如: Parse error on line 213 of document.xml

这是解压缩后docx的“正常”结构。

+--docProps
|  +  app.xml
|    core.xml
+  res.log
+--word //this folder contains most of the files that control the content of the document
|  +  document.xml //Is the actual content of the document
|  +  endnotes.xml
|  +  fontTable.xml
|  +  footer1.xml //Containst the elements in the footer of the document
|  +  footnotes.xml
|  +--media //This folder contains all images embedded in the word
|  |    image1.jpeg
|  +  settings.xml
|  +  styles.xml
|  +  stylesWithEffects.xml
|  +--theme
|  |    theme1.xml
|  +  webSettings.xml
|  --_rels
|       document.xml.rels //this document tells word where the images are situated
+  [Content_Types].xml
--_rels
     .rels

如docx标签wiki中所示。

损坏的邮编

如果压缩文件被破坏,在大多数情况下,它们是文件开头或结尾的一些字符,不应该在那里(或者应该也不应该)。

最好的做法是拥有同一文档的有效docx,并使用这两个文档的十六进制表示来查看有什么不同。

我通常使用hexdiff工具(apt-get install hexdiff)。

这通常会告诉你多余字符的位置。

很多时候,问题是您的头文件错误。


感谢edi9999的建议,我用十六进制编辑器查看未加密/解密的docx和加密/解密的docx之间的区别。

唯一的区别是在第一个(没有损坏)的末尾有3倍'00',它们不在损坏的区域中。

没有损坏的docx的解决方案是在我的解密数据的末尾添加3次“ 0”。 现在它工作得很好!

对于docx和pptx,它是“ 0”的3倍,而xlsx则是4倍。

链接地址: http://www.djcxy.com/p/7949.html

上一篇: Why is my docx, xlsx, pptx file corrupted?

下一篇: Correct way to detect mime type in php