在 AJAX 处理程序中下载文件
Download File in AJAX Handler
我只使用 PHP 编写了一个小脚本,使用实验性 API 测试文件下载功能,效果很好。当我决定将这段代码提交到我的项目时,我将相同的代码添加到我的 AJAX 调用的处理程序中,但是它并没有像以前那样开始下载。
我认为这是因为我正在使用 AJAX,但是当我使用 header() 在客户端启动文件下载时,我不知道如何解决这个。
现在有人可以推荐一种替代方法吗?
AJAX:
$.ajax({
type: "POST",
url: "handler.php",
data: { 'action': 'downloadFile', 'filename': curSelectedFile },
dataType: 'json',
success: function(data)
{
//Success
}
});
PHP 处理程序:
case "downloadFile":
{
$filename = '';
if (isset($_POST["filename"]))
{
$filename = $_POST["filename"];
}
$pos = 0; // Position in file to start reading from
$len = 32; // Length of bytes to read each iteration
$count = 0; // Counter for the number of bytes in the file
do
{
$result = $fm->getFileChunk($filename, $pos, $len);
$chunk = $result->result;
if (!empty($chunk))
{
$chunk = base64_decode($chunk);
$count += strlen($chunk);
echo $chunk;
}
$pos += $len;
}
while (!empty($chunk));
header('Content-Disposition: attachment; filename="'. $filename .'"');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . $count);
$response['status'] = "success";
echo json_encode($response);
break;
}
您可以使用 base64 对文件进行编码并使用 JavaScript 创建文件对象。
对于大文件我不推荐这个!
选择:
将您的文件保存在服务器上,您只需检索文件位置并使用 Ajax 回调中的 location.href
重定向即可。
您可以使用 atob()
解码 base64 并创建 类型数组 。参考以下link for creating Binary Object on client side. You create typed array like answered here.
我只使用 PHP 编写了一个小脚本,使用实验性 API 测试文件下载功能,效果很好。当我决定将这段代码提交到我的项目时,我将相同的代码添加到我的 AJAX 调用的处理程序中,但是它并没有像以前那样开始下载。
我认为这是因为我正在使用 AJAX,但是当我使用 header() 在客户端启动文件下载时,我不知道如何解决这个。
现在有人可以推荐一种替代方法吗?
AJAX:
$.ajax({
type: "POST",
url: "handler.php",
data: { 'action': 'downloadFile', 'filename': curSelectedFile },
dataType: 'json',
success: function(data)
{
//Success
}
});
PHP 处理程序:
case "downloadFile":
{
$filename = '';
if (isset($_POST["filename"]))
{
$filename = $_POST["filename"];
}
$pos = 0; // Position in file to start reading from
$len = 32; // Length of bytes to read each iteration
$count = 0; // Counter for the number of bytes in the file
do
{
$result = $fm->getFileChunk($filename, $pos, $len);
$chunk = $result->result;
if (!empty($chunk))
{
$chunk = base64_decode($chunk);
$count += strlen($chunk);
echo $chunk;
}
$pos += $len;
}
while (!empty($chunk));
header('Content-Disposition: attachment; filename="'. $filename .'"');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . $count);
$response['status'] = "success";
echo json_encode($response);
break;
}
您可以使用 base64 对文件进行编码并使用 JavaScript 创建文件对象。
对于大文件我不推荐这个!
选择:
将您的文件保存在服务器上,您只需检索文件位置并使用 Ajax 回调中的 location.href
重定向即可。
您可以使用 atob()
解码 base64 并创建 类型数组 。参考以下link for creating Binary Object on client side. You create typed array like answered here.