首页 > 解决方案 > $.ajax 之后编码错误的 Blob

问题描述

我创建了一个从后端恢复字符串并将其放入 blob 的应用程序。

我用 fetch 和 async-await 写的。问题是EI11不支持它们。

我可以通过$.ajax GET请求轻松重写。

当我使用 fetch 时,我可以毫无问题地从 URL 中检索 blob。

我得到一个对象作为响应,身体作为ReadableStream.

当我使用 时$.ajax,我只返回一个字符串。当我把它放在一个blob中时,我得到了不同的结果。

例如,使用 fetch 我的 blob URL 如下所示:

Response: F)D�=C�w�Cu9mc�  
Preview: F)D�=C�w�Cu9mc�   
User window: F)DØ=CŠwºCu9mcœ  

Content-Length: 16
Content-Type: text/html

这样我就可以得到预期的正确结果。

但随着 $.ajax

Response: F)D�=C�w�Cu9mc� 
Preview: F)D�=C�w�Cu9mc�  
User window: F)D�=C�w�Cu9mc�  

Content-Length: 24
Content-Type: text/html

如果我控制台记录 blob,我还会看到内容长度的差异。

我真的不想用外部库重写应用程序,或者将其调整为 babel。但我需要 EI11支持。

我的获取代码:

var res = null;             
res = await fetch( window.location.origin +"url_path"); 
const blob = await res.blob();
var objectURLL = URL.createObjectURL(blob);
settings.clip.token_old = settings.blob_prefix+objectURLL.split("/")[3];

我的$.ajax代码:

var blob = null;
var objectURL = null;
$.ajax({ 
    url: "url_path"
    contentType: 'text/html ; charset=utf-8',
    success: function (res){
        blob = new Blob([res],{type:"text/html"});
        objectURL = URL.createObjectURL(blob);
    },
    async: false
}); 

也试过:

blob = new Blob([BOM, res],{encoding:"UTF-8",type:"text/html;charset=UTF-8"});

和:

blob = new Blob([BOM, res],{type:"text/html;charset=UTF-8"});

我发现了一个向 blob 添加 BOM 的主题,以强制浏览器正确读取它。

像这样:

var BOM = new Uint8Array([0xEF,0xBB,0xBF]);
blob = new Blob([BOM, res],{encoding:"UTF-8",type:"text/html;charset=UTF-8"});

这在浏览器中给了我这个:

F)D�=C�w�Cu9mc�
Content-Length: 27  
Content-Type: text/html

但它并不真正等于原始字符串,对我不起作用。

标签: javascriptajaxfetchblob

解决方案


推荐阅读