更新:
我将在下面留下我原来的答案,但我现在发现我并没有真正回答这个问题。没有办法“本机”执行此操作,我能想到的最佳方法是使用数据 uri (http://en.wikipedia.org/wiki/Data_URI_scheme) 并让 AJAX 为您完成工作:
// aware that you didn't mention jQuery, but you can do this with or without
var download = function(){
var mime = this.getAttribute('data-mime-type');
$.ajax({
accepts: mime,
success: function(data){
var uri = 'data:'+mime+';charset=UTF-8,' + encodeURIComponent(data);
window.location = uri;
}
})
return false;
}
与以下示例中使用的想法相同:
<a href="/some-csv-endpoint" data-mime-type="text/csv">Download CSV</a>
document.querySelectorAll('a[data-mime-type]').onclick = download;
原答案
没有内置方法可以强制链接上的“接受”标头(通过 HTML 或 Javascript)。我认为您可以使用非常少量的服务器和客户端代码轻松完成此任务。任何语言都应该很容易,我的例子是 PHP:
function get_accepted_headers() {
$headers = apache_request_headers();
if(array_key_exists('Accept', $headers)) {
$accepted = explode(',', $headers['Accept']);
return $accepted;
}
return array();
}
为您的下载链接添加 data-accept 属性:
<a href="/some-csv-file.csv" data-accept="text/csv">Download CSV</a>
然后附加一个点击事件处理程序以确保用户接受指定的内容类型:
// will end up with something like: ["text/html", "application/xhtml+xml", "application/xml;q=0.9", "image/webp", "*/*;q=0.8"]
var user_headers = <?=stripslashes(json_encode(get_accepted_headers()))?>;
var click_header_check = function() {
var accept = this.getAttribute('data-accept');
if(user_headers.indexOf(accept) == -1) {
console.log('User does not explicitly accept content-type: %s', accept);
return false;
}
window.location = this.href;
return;
}
// attach the event listener
document.querySelector('a[data-accept]').onclick = click_header_check;
不确定这是否是您要找的,但希望对您有所帮助。