試試這個:
$url = "https://cdn.psychologytoday.com/sites/default/files/blogs/38/2008/12/2598-75772.jpg";
$name = 'happy.jpg';
$image = Image::make($url)->encode('jpg');
$headers = [
'Content-Type' => 'image/jpeg',
'Content-Disposition' => 'attachment; filename='. $name,
];
return response()->stream(function() use ($image) {
echo $image;
}, 200, $headers);
下面是我們正在做的事情。我們使用Intervention Image將該圖像編碼爲適合我們的正確文件類型格式。然後,我們自己設置瀏覽器標題,告訴瀏覽器它是什麼類型的文件,並且我們希望瀏覽器將其視爲可下載的附件。最後,我們使用Laravel的stream()
方法返回響應並使用閉包。我們通過use ($image)
告訴關閉它可以訪問圖像的編碼數據,然後我們只是將該原始數據回顯到頁面上。從那裏,我們告訴瀏覽器HTTP代碼是200(OK),然後給它我們的頭文件,告訴瀏覽器該做什麼。
你的問題是,Laravel的方便的download()
方法期望它是文件系統上的文件。所以我們必須流式傳輸並自己手動設置標題。
您需要編寫一些額外的代碼來處理干預使用的encode()
方法的不同文件擴展名以及返回的Content-Type
。您可以找到所有可用MIME類型的列表here。
我希望這會有所幫助。
是不是臨時保存te文件並在下載後刪除它的選項? – Christophvh
這是一個選項,但它在我的選擇中並不是很乾淨 - 但是,感謝這個想法:) –
@Christophvh你不會被迫在Laravel上做。 – Troyer