blob 上的错误内容类型无法打开 img / 文件已损坏

Posted

技术标签:

【中文标题】blob 上的错误内容类型无法打开 img / 文件已损坏【英文标题】:wrong content type on blob cant open img / file is damaged 【发布时间】:2021-11-30 00:12:27 【问题描述】:

我正在尝试使用 JS Blob() 函数下载文件,但我无法打开它。由于我得到了一个文件列表,所以事先不清楚是什么类型,用户可以选择下载什么。 Mac 说,格式可能已损坏,无法打开该文件。

我创建一个 blob 的 cURL 响应是一个二进制字符串(至少我相信是这样,因为当我转储它时,你只会看到随机符号和字符,就像你用文本编辑器打开图像时一样)

这是Image code,因为我通过我的 cURL 的响应获得了它

这是我下载此图片的代码。

                var a;
            a = document.createElement('a');

            a.href = URL.createObjectURL(new Blob([JSON.stringify(response)]));

           // here i tried with and without JSON.stringify
           // also tried new Blob([JSON.stringify(response)],type:'image/jpeg') or with * instead of jpeg, nothing works. Does anybody happen to know what mistake i am doing?

            a.download = data.data.name;
            a.style.display = 'none';
            document.body.appendChild(a);
            a.click();

这几天一直在苦苦挣扎,感谢任何帮助。

当我(在 Mac 终端)执行以下命令时:

file test.jpeg

返回

test.jpeg: data

最好的问候

编辑:我的 php 代码

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://myapi.com/webapp/api/v1/document/id/" . $id . "/download");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('AuthenticationToken:' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);


curl_close($ch);
echo $output;

【问题讨论】:

您能否提供响应的内容或它的外观示例? 如果你点击突出显示的“图像代码”并下载txt文件,那么你会看到文件的长内容,这是我唯一得到的东西 此链接崩溃 我现在添加了一个新链接,指向显示内容的 jsfiddle 您是否正确地尝试使用 Unicode 字符串传输二进制数据? 【参考方案1】:

您可以尝试将图像数据序列化为base64字符串并传递给客户端

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://myapi.com/webapp/api/v1/document/id/" . $id . "/download");
curl_setopt($ch, CURLOPT_HTTPHEADER, array("AuthenticationToken:" . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);

$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

curl_close($ch);

$base64 = "data:/" . $contentType . ";base64," . base64_encode($output);

echo $base64;

在这种情况下,在您的客户端,您只需要像这样放置 href 的响应文本:

const a = document.createElement('a');
a.href = response;
a.download = data.data.name;
a.style.display = 'none';
document.body.appendChild(a);
a.click();

【讨论】:

我尝试使用内容类型并返回这里并得到结果。非常感谢安迪,真的!

以上是关于blob 上的错误内容类型无法打开 img / 文件已损坏的主要内容,如果未能解决你的问题,请参考以下文章

设置存储在 Blob 上的媒体文件的内容类型

Azure:无法从 Azure 函数 HttpTrigger 读取 Blob 文本(400 - 错误请求错误)

无法从 BLOB 存储打开备份设备 - 访问被拒绝

Azure blob 到 Azure SQL 数据库:无法批量加载,因为无法打开文件“xxxx.csv”。操作系统错误代码 5(访问被拒绝。)

JavaScript事件

从终端运行 Xcode 无法打开 javascript 脚本(错误:仪器无法打开“TextWrangler 文本文档”格式的文件。”)