【发布时间】:2012-03-29 03:57:05
【问题描述】:
我正在为 Google Chrome 开发一个扩展程序,它可以生成一个 mp3 文件并使用 FileSystem API 将其保存到本地存储。当我保存时,我指定了 mime 类型“application/octec-stream”。后来我向用户发送文件 url,而不是下载文件,浏览器开始在 html5 播放器上播放它。查看响应,很明显返回的 mime 类型是基于文件扩展名的“audio/mp3”。 问题是:如何有效地让浏览器下载文件而不是播放文件?这是我在 javascript 上所做的小 sn-p。
fs.root.getFile(contextData.songInfo.Name + ".mp3", { create: true }, function (fileEntry) {
// Create a FileWriter object for our FileEntry (log.txt).
fileEntry.createWriter(function (fileWriter) {
fileWriter.onwriteend = function (e) {
console.log('Write completed.');
};
fileWriter.onerror = function (e) {
console.log('Write failed: ' + e.toString());
};
var bb = new window.WebKitBlobBuilder();
bb.append(buffer);
fileWriter.write(bb.getBlob('application/octet-stream'));
contextData.fileUrl = fileEntry.toURL();
callback(contextData);
}, errorHandler);
}, errorHandler);
【问题讨论】:
-
MIME 类型只存在于 HTTP 协议中,对于文件系统,它们总是从文件扩展名中推导出来的。似乎 Chrome 对使用 FileSystem API 创建的文件的处理方式相同。
-
问题是,当我将用户重定向到文件的 URL 时,我又回到了 HTTP 世界,让我决定与 http 响应一起发送哪种 mime 类型是合理的。我不希望用户在浏览器中听到文件,他们需要保存它。现在我添加了一个 .download 扩展名并且 ir 触发下载,但是该文件必须由用户稍后重命名,这很痛苦。也许将文件封装在一个 .zip 中,但用户在使用它之前再次采取行动并解压缩。
标签: html google-chrome filesystems