Laravel
前言
目的是将前端看到的 url图片储存在本机 sever。
读取图片
目前有两种做法可以取得图片:file_get_contents 和 fopen,皆是 php 的内建函式。
file — Reads entire file into an arrayfile_get_contents — Reads entire file into a stringfopen — Opens file or URLfopen
$file = fopen ($url, 'rb');
file_get_contents
$contents = file_get_contents($url);
储存图片
存 url 的图
也有两种做法:
File open
$file = fopen ($url, 'rb');if ($file) { $newf = fopen ($newfname, 'wb'); if ($newf) { while(!feof($file)) { fwrite($newf, fread($file, 1024 * 8), 1024 * 8); } }}if ($file) { fclose($file);}if ($newf) { fclose($newf);}
$newfname = '../public/storage/image.'.File::extension(public_path($url));
File::extension(public_path($url)) 取得副档名
Storage
Storage 是 laravel写好的 Facades. 用 put/get 存取档案
Storage将档案存在storage/app/public
目录下,当我们执行php artisan storage:link
,会建立一个 symbolic link,从 public/storage
连结到真正存档的地方(storage/app/public)。
$contents = file_get_contents($url);$name = substr($url, strrpos($item_info->pic, '/') + 1);//从url取得档名$stored = Storage::put('public/'.$name, $contents);
存 client 上传的图
用 store method$imageURL = request()->file('img')->store('public');$reward->update(['reported_descript'=>$request->reported_descript,'img'=>asset('storage/' . substr($imageURL, 7))]);
读取档案
fopen
$file=fopen('../public/storage/'.explode('/', $item->img)[4], 'r');$contents = fread($file,filesize('../public/storage/'.explode('/', $item->img)[4]));
Storage
$contents = Storage::get('public/'.explode('/', $item->img)[4]);
送出档案:
用 Guzzle 套件来发送带有图片的 request:
$file=fopen('../public/storage/'.explode('/', $item->img)[4], 'r');$contents = fread($file,filesize('../public/storage/'.explode('/', $item->img)[4]));$deliever_photo = new Client([ 'headers' => ['Authorization' => "Bearer ".env('STATION_KEY'), 'Content-Type' => 'multipart/form-data']]);$response_img = $deliever_photo->request('POST', env('STATION_BASE_URL').'/api/image',['multipart' => [ [ 'name' => "good_id", 'contents' => $response_de->id ], [ 'name' => "photo", 'contents' => $contents, 'filename' => $name, 'headers' => ['Content-Type' => 'image/png'] ],]]);