Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用Blob对象在客户端打开'docx'文件-vanilla JavaScript_Javascript_Xml_File_Blob_Docx - Fatal编程技术网

无法使用Blob对象在客户端打开'docx'文件-vanilla JavaScript

无法使用Blob对象在客户端打开'docx'文件-vanilla JavaScript,javascript,xml,file,blob,docx,Javascript,Xml,File,Blob,Docx,这是客户端代码,它是一个最小的、完整的、可验证的代码片段,允许其他开发人员自己测试 // requires: a string that contains html tags // returns: a word document that can be downloaded with extension .doc or docx // @ param cvAsHTML is a string that contains html tags const preHtml = "<html

这是客户端代码,它是一个最小的、完整的、可验证的代码片段,允许其他开发人员自己测试

// requires: a string that contains html tags
// returns: a word document that can be downloaded with extension .doc or docx
// @ param cvAsHTML is a string that contains html tags

const preHtml = "<html xmlns:v='urn:schemas-microsoft-com:vml' xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/html4/loose.dtd\'><head><meta charset='utf-8'></head><body>";
const postHtml = "</body></html>";
const html = preHtml + cvAsHTML + postHtml;

let filename = "filename";
const blob = new Blob(["\ufeff", html], { type: "application/msword"});
注意:我已经更改了Blob对象内的MIME类型,并尝试了其他不同的选项,如
application/zip
application/octet-stream
等,但没有成功。我还更改了
prehtml
变量,以包括:

<?xml version='1.0' encoding='UTF-8?>

我觉得事情没那么简单。具有docx扩展名的文档确实是压缩的,但没有单个压缩文件,但需要特定的文件夹结构和文件名,请参阅。为了能够动态生成文档,您必须生成“最小结构和文件”。您可以理解我所说的将空docx文件保存并解压缩的意思。试着在微软的Word或LibreOffice或其他任何地方,结构都是“相同的”

带拉链-也许这会有帮助


对于文档本身,我可以建议我们使用的方法。我们在office应用程序中准备了“模板文档”,并在其中放置了占位符,如$HEADER$、$BODY$等。。然后在程序中,我们解压缩它,用真正的字符串替换占位符,然后将其压缩到输出。这是非常有效和实用的-我们完全控制了最终文件,很容易改变设计,颜色,静态文本-只需编辑模板,然后上传

.docx
是压缩文件的集合,使用,我创建了一个
“.zip”
文件,其中包含主
word/document.xml
文件和3个额外的必需文件

有关
.docx
文件的更多信息,请访问:

//其他需要的文件
const REQUIRED_文件={
内容类型xml:`
`,
相关信息:`
`,
文档xml关系:`
`
};
/// --
const preHtml=`
`;
常量postHtml=`
`;
const cvAsHTML=`Sample content inside.docx`;
consthtml=preHtml+cvAsHTML+postml;
函数generateDocx(fname){
让zip=newjszip();
//先决条件:
zip.file(“\u rels/.rels”,必需的\u FILES.rels);
zip.file(“[Content\u Types].xml”,必需的\u文件.Content\u Types\u xml);
zip.file(“word/_-rels/document.xml.rels”,必选文件.document\u-xml\u-rels);
//
zip.file(“word/document.xml”,html);
generateAsync({type:“blob”}).then(函数(内容){
saveAs(content,fname+“.docx”);
});
}


下载.docx
感谢您的回答以及您花费的时间来写这篇文章。这并不能回答问题,因为给出的所有信息/参考都是通用的。我已经知道了这一切。这个问题提供了我试图完成的代码片段;我能够在客户端下载
doc
文件,但当我对
docx
文件进行类似尝试时,文件被证明已损坏。为什么呢?我的代码中缺少了什么?是我构造
prehtml
posthtml
字符串的方式吗?它是Blob obj中的类型吗(参见问题的标题)?我不只是在寻找外部参考。谢谢你的详细答案,它确实非常有用。然而,这并不像预期的那样有效。为了清晰起见,我重复一下,我用JS native blob创建的函数工作起来很有魅力。当用户以
doc
格式保存文件时,浏览器本机支持“使用microsoft word保存文件”,我可以直接打开文件,而无需选择“保存”选项。尝试运行您自己的代码段,您将看到浏览器不允许您将文件保存在docx中,也不允许您像使用
doc
文件那样打开(读取)文件。@您确定要将
.docx
扩展名添加到文件名(1)中吗?正如我在两台Windows机器和Mac上测试的那样。他们都在打开word文档。是的,我有。我正在运行一些额外的测试,因为我最初的假设是cvAsHTML变量包含要处理的无效语法,但即使完全删除该变量,文件也不会打开。在MS操作系统中的铬和FF中测试。
<?xml version='1.0' encoding='UTF-8?>