为了实现跨域下载视频,经历很多。。。
后台
使用laravel自带的download方法,返回文件流
官方文档:https://learnku.com/docs/laravel/10.x/filesystem/14865#5dfd5a
Route::get('fncVideoDownload', function () {
return Storage::disk('sftp')->download('upload/video/123.mp4');
});
或者
Route::get('fncVideoDownload', function () {
return response()->stream(function () {
//echo file_get_contents("http://123.456.7.89/upload/video/uploadr/bbb.jpeg");// image/jpeg
echo file_get_contents("http://123.456.7.89/upload/video/aaa.mp4");// video/mp4
}, 200, ['Content-Type' => 'video/mp4']);
});
前台
<template>
<a
id="fileDownload"
href=""
download=""
target="_blank"
style="display: none"
></a>
</template>
<script lang="ts">
function download(){
//创建的a标签
const link = document.getElementById('fileDownload')
if (link) {
//想传到后台的参数
const params = {
aa: 'aaaa',
}
//interfaceUrl:路由URI
let responsedata: Blob = await axios.get(
'interfaceUrl',
{
params,
//必须写
responseType: 'blob',
}
)
const blobUrl = window.URL.createObjectURL(responsedata)
link.setAttribute('href', blobUrl)
link.setAttribute('download', 'newname.mp4')
link.click()
window.URL.revokeObjectURL(blobUrl)
}
}
</script>
/usr/local/etc/apache24/httpd.conf中下边四个解开
LoadModule proxy_module libexec/apache24/mod_proxy.so
LoadModule proxy_connect_module libexec/apache24/mod_proxy_connect.so
LoadModule proxy_ftp_module libexec/apache24/mod_proxy_ftp.so
LoadModule proxy_http_module libexec/apache24/mod_proxy_http.so
再添加:
proxypass /videodownload http://123.456.7.89
proxypass /videodownload http://123.456.7.89/upload/video 这种直接给文件夹带上也行
重启apache即可
quasar.config.js(文件在根目录中)的devServer中添加代理,设置跨域访问
代码复制↓
proxy:{
//随便起的名字
'/videodownload': {
// 目标地址
target: 'http://123.456.7.89',
// 跨域访问设置,true代表跨域
changeOrigin: true,
//前缀删除
rewrite: path => path.replace(/^\/videodownload/, '')
}
}
开发前先直接在浏览器输入地址看看视频存不存在
//===== method 1 ========================
var x = new XMLHttpRequest()
x.open('GET', '/videodownload/upload/video/123.mp4', true)
x.responseType = 'blob'
x.onload = function (e) {
const url = window.URL.createObjectURL(x.response)
link.setAttribute('href', url)
link.setAttribute('download', 'newname.mp4')
link.click()
}
x.send()
//===== method 2 ========================
let blob = await fetch('/videodownload/upload/video/123.mp4').then((r) => r.blob())
const blobUrl = window.URL.createObjectURL(blob)
link.setAttribute('href', blobUrl)
link.setAttribute('download', 'newname.mp4')
link.click()
window.URL.revokeObjectURL(blobUrl)