前端使用POST请求下载图片,php后端如何实现以POST的形式向前端输出文件,并调用浏览器自带的下载弹窗,实现下载图片
时间: 2024-03-16 09:40:55 浏览: 113
根据url获取网络图片通过浏览器下载的前端解决方案
在 PHP 中,可以使用 `readfile` 函数以 POST 的形式向浏览器输出文件,然后使用 `Content-Disposition` 头信息告诉浏览器打开下载弹窗,让用户下载文件。下面是一个实现的例子:
前端代码:
```javascript
function downloadImage(url) {
const xhr = new XMLHttpRequest();
xhr.open('POST', 'download.php', true);
xhr.responseType = 'blob';
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
if (xhr.status === 200) {
const blob = new Blob([xhr.response], { type: 'image/jpeg' });
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = 'image.jpg';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
} else {
console.error('Error:', xhr.statusText);
}
};
xhr.onerror = function() {
console.error('Error:', xhr.statusText);
};
xhr.send('url=' + encodeURIComponent(url));
}
```
在这个例子中,我们使用 `XMLHttpRequest` 对象向服务器发送 POST 请求,并将 `responseType` 设置为 `blob`,以便在响应完成后获取文件二进制数据。当响应成功时,我们创建一个 Blob 对象,并将 URL 对象与该 Blob 对象关联起来,然后创建一个链接元素,将链接的 `href` 属性设置为 URL 对象的 URL,将 `download` 属性设置为文件名,最后触发链接的 `click` 事件,让浏览器自动弹出下载弹窗。如果请求出错,我们就在控制台打印错误信息。
后端代码(download.php):
```php
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$url = $_POST['url'];
$data = file_get_contents($url);
header('Content-Type: image/jpeg');
header('Content-Disposition: attachment; filename="image.jpg"');
echo $data;
}
```
在这个例子中,我们从 POST 请求中获取图片的 URL,使用 `file_get_contents` 函数获取图片的二进制数据,并将 `Content-Type` 头信息设置为 `image/jpeg`,将 `Content-Disposition` 头信息设置为 `attachment; filename="image.jpg"`,告诉浏览器将响应内容保存为文件,并将响应数据输出到客户端。
阅读全文