Javascript 乌什(拜特里); } var blob=新blob(byteArray,{type:contentType}); 返回斑点; }
这是我用来下载我们的Django服务器按需生成的PDF的,她似乎运行得非常好 附录 我们的网站之所以这样做,而不仅仅是为了在后续调用中返回文件名,是因为它在服务器I/O上更容易一些。选择的解决方案意味着请求的文件必须存在于服务器上的某个位置—很可能存在于磁盘上。(可以使用PHP的Javascript 乌什(拜特里); } var blob=新blob(byteArray,{type:contentType}); 返回斑点; },javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,这是我用来下载我们的Django服务器按需生成的PDF的,她似乎运行得非常好 附录 我们的网站之所以这样做,而不仅仅是为了在后续调用中返回文件名,是因为它在服务器I/O上更容易一些。选择的解决方案意味着请求的文件必须存在于服务器上的某个位置—很可能存在于磁盘上。(可以使用PHP的tmpfile()将生成的文件保存在内存中,但我对PHP的了解有限,因此我不知道如何在HTTP调用之间保存该文件) 我的项目制作了大量的PDF文件,可能有数百页。我真的,真的不想从这些数据中创建一个实际的文件对象,将其保
tmpfile()
将生成的文件保存在内存中,但我对PHP的了解有限,因此我不知道如何在HTTP调用之间保存该文件)
我的项目制作了大量的PDF文件,可能有数百页。我真的,真的不想从这些数据中创建一个实际的文件对象,将其保存到磁盘,然后几乎立即将其从磁盘中读取回来(我知道服务器并不是这样做的,但无论如何,您将其切片—它做的工作超出了需要)。服务器制作了PDF,它在内存中,为什么不只是。。。把它还给客户
像这样返回文件意味着不需要做任何额外的清理工作——一旦Base64离开大楼,就这样了。磁盘上没有文件,因此以后没有什么需要处理的(好的或坏的,取决于您的需要)。您能解释一下您真正想要做什么吗?我真的不明白你的要求。@lexith我正在尝试在我的客户端上获得“另存为”对话框,该对话框是用HTML/jQuery编写的。好吧,那么你提到的建议解决方案有什么问题?你说过你知道用ajax做不到,错的是它在客户端不起作用,这意味着不会出现“另存为”对话框。我可能把事情搞混了,因为它不是通过Rob提供的解决方案工作的。谢谢你,莱克西斯!你能解释一下你到底想做什么吗?我真的不明白你的要求。@lexith我正在尝试在我的客户端上获得“另存为”对话框,该对话框是用HTML/jQuery编写的。好吧,那么你提到的建议解决方案有什么问题?你说过你知道用ajax做不到,错的是它在客户端不起作用,这意味着不会出现“另存为”对话框。我可能把事情搞混了,因为它不是通过Rob提供的解决方案工作的。谢谢你,莱克西斯!哇!我看不见树林,看不见树木。我用解决方案更新了我的问题。谢谢哇!我看不见树林,看不见树木。我用解决方案更新了我的问题。谢谢你为什么这样做而不是直接分发PDF?我的意思是,除了造成额外的流量,你为什么不直接分发PDF,而是这样做呢?我的意思是除了造成额外的交通。
http://localhost:8080/slim3/public/api/v1/files/Test1.jpg
http://localhost:8080/slim3/public/api/v1/files/Test2.txt
...
$(document).ready(function(){
$(document).on('click', '#file', function(e){
e.preventDefault();
var filename = $(this).data('url');
$.ajax({
type : "GET",
cache: false,
url : "http://localhost:8080/slim3/public/api/v1/files/" + filename,
success : function(data) {
console.log(data) // the console writes nothing
//window.location = "data:application/octet-stream," + encodeURIComponent(data); // not working
//var downloadUrl = data.url; // not working
//window.location = downloadUrl; // // not working
},
error : function(data) {}
});
});
});
public function show($request, $response, $args)
{
$file = 'C:\xampp\htdocs\slim3\storage\Test1.jpg';
$res = $response->withHeader('Content-Description', 'File Transfer')
->withHeader('Content-Type', 'application/octet-stream')
->withHeader('Content-Disposition', 'attachment;filename="'.basename($file).'"')
->withHeader('Expires', '0')
->withHeader('Cache-Control', 'must-revalidate')
->withHeader('Pragma', 'public')
->withHeader('Content-Length', filesize($file));
readfile($file);
return $res;
}
$(document).on('click', '#file', function(e){
e.preventDefault();
var filename = $(this).data('url');
window.location = "http://localhost:80/slimmi/public/api/v1/files/" + filename;
});
var url = $(this).data('url');
var filename = url.substring(url.lastIndexOf("/") + 1, url.length);
$.ajax({
type: "GET",
url: target,
success: function (response) {
// create a download anchor tag
var downloadLink = document.createElement('a');
downloadLink.target = '_blank';
downloadLink.download = 'your-file-name-here';
// convert Base64 to Blob - don't forget to set content type!
var blob = b64toBlob(response, [file type here]);
// create an object URL from the Blob
var URL = window.URL || window.webkitURL;
var downloadUrl = URL.createObjectURL(blob);
// set object URL as the anchor's href
downloadLink.href = downloadUrl;
// append the anchor to document body
document.body.appendChild(downloadLink);
// fire a click event on the anchor
downloadLink.click();
// cleanup: remove element and revoke object URL
document.body.removeChild(downloadLink);
URL.revokeObjectURL(downloadUrl);
}
});
function b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
var blob = new Blob(byteArrays, {type: contentType});
return blob;
}