2017-03-07 42 views
1

我想簡單地上傳文件,調整它們大小,然後爲每個上傳的文件強制下載。我不想保存這些文件。Laravel + Image Intervention:強制下載未保存的文件

調整大小等工作正常,但我無法設法強制下載新文件。

$content = $image->stream('jpg'); 

return response()->download($content, $name); 

的顯示在

is_file)片斷的結果(預計參數1是一個有效的路徑,串給出

最有可能是因爲$的內容是不是一個路徑,但實際數據。

有沒有辦法強制下載而不先保存它?

+0

是不是臨時保存te文件並在下載後刪除它的選項? – Christophvh

+0

這是一個選項,但它在我的選擇中並不是很乾淨 - 但是,感謝這個想法:) –

+0

@Christophvh你不會被迫在Laravel上做。 – Troyer

回答

1

試試這個:

$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

我希望這會有所幫助。