Aru*_*van 33 javascript ajax filenames file-type content-disposition
我下载文件作为ajax的响应.如何从内容处理中获取文件名和文件类型,并为其显示缩略图.我有很多搜索结果,但找不到正确的方法.
$(".download_btn").click(function () {
var uiid = $(this).data("id2");
$.ajax({
url: "http://localhost:8080/prj/" + data + "/" + uiid + "/getfile",
type: "GET",
error: function (jqXHR, textStatus, errorThrown) {
console.log(textStatus, errorThrown);
},
success: function (response, status, xhr)
{
var header = xhr.getResponseHeader('Content-Disposition');
console.log(header);
}
});
Run Code Online (Sandbox Code Playgroud)
控制台输出:inline; filename=demo3.png
Win*_*ier 66
这是我在某个时候使用它的方式.我假设您提供附件作为服务器响应.
我从我的REST服务中设置了这样的响应头 response.setHeader("Content-Disposition", "attachment;filename=XYZ.csv");
function(response, status, xhr){
var filename = "";
var disposition = xhr.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') !== -1) {
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]) {
filename = matches[1].replace(/['"]/g, '');
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:编辑答案以适合您的问题 - 使用单词inline代替attachment
function(response, status, xhr){
var filename = "";
var disposition = xhr.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('inline') !== -1) {
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]) {
filename = matches[1].replace(/['"]/g, '');
}
}
}
Run Code Online (Sandbox Code Playgroud)
J S*_*ott 33
如果你想获取文件名并支持那些奇怪的 url 编码的 UTF-8 标头和 ascii 标头,你可以使用类似的东西
public getFileName(disposition: string): string {
const utf8FilenameRegex = /filename\*=UTF-8''([\w%\-\.]+)(?:; ?|$)/i;
const asciiFilenameRegex = /^filename=(["']?)(.*?[^\\])\1(?:; ?|$)/i;
let fileName: string = null;
if (utf8FilenameRegex.test(disposition)) {
fileName = decodeURIComponent(utf8FilenameRegex.exec(disposition)[1]);
} else {
// prevent ReDos attacks by anchoring the ascii regex to string start and
// slicing off everything before 'filename='
const filenameStart = disposition.toLowerCase().indexOf('filename=');
if (filenameStart >= 0) {
const partialDisposition = disposition.slice(filenameStart);
const matches = asciiFilenameRegex.exec(partialDisposition );
if (matches != null && matches[2]) {
fileName = matches[2];
}
}
}
return fileName;
}
Run Code Online (Sandbox Code Playgroud)
一些注意事项:
", 为_(Chrome)filename=一个或;结尾之后和之前的所有文本视为文件名。../../../../../../../path/to/system/files/malicious.dll)Shi*_*uri 16
这是对 marjon4 答案的改进。
选择答案的一种更简单的方法是使用 split ;
var fileName = xhr.getResponseHeader('content-disposition').split('filename=')[1].split(';')[0];
Run Code Online (Sandbox Code Playgroud)
注意:如果您的文件名本身包含分号 (;),则此解决方案可能无法按预期工作
mar*_*on4 13
或者只是:
var fileName = xhr.getResponseHeader('Content-Disposition').split("filename=")[1];
Run Code Online (Sandbox Code Playgroud)
在我的情况下,标题如下所示:
attachment; filename="test-file3.txt"
Run Code Online (Sandbox Code Playgroud)
因此,我能够使用命名组正则表达式很容易地提取文件名:
const regExpFilename = /filename="(?<filename>.*)"/;
const filename: string | null = regExpFilename.exec(contentDispositionHeader)?.groups?.filename ?? null;
Run Code Online (Sandbox Code Playgroud)
我知道我在这里有点偏离主题,因为 OP 没有在文件名周围加上引号,但仍然共享以防有人遇到与我刚刚做的相同的模式
| 归档时间: |
|
| 查看次数: |
44279 次 |
| 最近记录: |