ami*_*mit 17 javascript asp.net ajax jquery download
我想向URL发送请求,该URL为我提供了文件下载对话框.同时,服务器需要请求标头中的某些参数.我想在请求中插入自定义标头并获取响应文件.有什么方法可以实现这个目标吗?
尝试使用a带有data-*set to headers for request的元素,$.ajax()并将headers选项设置为aelement data-headers对象.
在$.ajax() success集a元素href,以响应为Blob内objectURL,download属性file.name或临时文件名,叫.click()上a元素激活"保存文件"对话框.
$(document).ready(function() {
$("input[type=button]").click(function() {
// set `data-headers` object
var el = $("[data-headers]");
el.data("headers")["x-custom-headers"] = $("input[type=text]")[0].value
|| el.data("headers")["x-custom-headers"];
$.ajax({
url: URL.createObjectURL(new Blob([$("textarea").val()], {
type: "text/plain"
})),
type: "GET",
// set `headers` to `a` element `data-headers` object
headers: $("[data-headers]").data("headers"),
beforeSend: function(jqxhr) {
console.log(this.headers);
alert("custom headers" + JSON.stringify(this.headers));
},
success: function(data, textStatus, jqxhr) {
var file = new Blob([data], {
"type": jqxhr.getResponseHeader("Content-Type")
});
console.log(data, file);
$("textarea, input[type=text]").val("");
$("a")
.attr({
"href": URL.createObjectURL(file),
"download": file.name || "file-" + $.now()
}).on("click", function() {
$(this).remove()
})
.get(0).click();
},
error: function(jqxhr, textStatus, errorThrown) {
console.log(textStatus, errorThrown)
}
});
})
})Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<textarea maxlength="5" placeholder="echo"></textarea>
<br>
<!-- set `x-custom-header` to `input type="text"` value -->
<input type="text" maxlength="5" placeholder="set request header" />
<br />
<input type="button" value="download" />
<!-- set default `x-custom-header` to "123" -->
<a data-headers='{"x-custom-headers":"123"}'></a>Run Code Online (Sandbox Code Playgroud)
据我所知,您想要从Web请求一个需要身份验证标题但无法通过简单链接下载的文件.
您需要做的是使用身份验证标头进行ajax调用以将数据下载为blob.然后从客户端保存数据
jQuery的ajax/get方法不支持responseType = blob
所以这个例子是在Blink和Firefox中使用最新的Fetch API.它还使用FileSaver.js来保存客户端生成的blob以及处理跨浏览器问题的方式.
fetch("/", {headers: {"X-mashape-key": "XXXXXX-4-YYYYYY"}})
.then( response => {
// we can get the filename if the
// response headers contains Content-Disposition
var cd = response.headers.get("Content-Disposition");
var name = cd && cd.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/)[1];
response.blob().then(
blob => window.saveAs(blob, name || "index.html")
)
})
Run Code Online (Sandbox Code Playgroud)
它还使用es6中提供的一些新的suger语法,可以使用babel或traceur转换为es5
如果你不包含一个fetch polyfill并且需要支持旧的浏览器 - 那么你需要用XHR的旧方式来做
var xhr = new XMLHttpRequest();
xhr.responseType = 'blob';
xhr.open("get", "/");
xhr.setRequestHeader("X-mashape-key", "XXXXXX-4-YYYYYY");
xhr.send();
xhr.onload = function(){
var cd = xhr.getResponseHeader("Content-Disposition")
var name = cd && cd.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/)[1];
window.saveAs(xhr.response, name || "index.html")
}
Run Code Online (Sandbox Code Playgroud)
小智 -1
也许我没明白你的意思。
我的想法是这样的:
//server xxx.php
//omit some code
echo '<a href="file_path" id="download">file_name</a>';
//browser
ajax({
url: 'http://xxxx/xxx.php',
success: function(html){
//append to dom and TODO other manipulations
$(dom).append(html);
$('#download').trigger('click');
$(dom).remove(html);
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5954 次 |
| 最近记录: |