ホームページ  >  記事  >  バックエンド開発  >  Laravel でのロギングとアップロード、_PHP チュートリアル

Laravel でのロギングとアップロード、_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-12 09:02:57733ブラウズ

Laravel でのログとアップロード、

PHP には多くのフレームワークがあり、私自身もそのうちのいくつかに触れてきました。大学では何も知らなかったので、ThinkPHP を手に取って学びました。 TPについて文句を言う人はたくさんいるかもしれませんが、個人的には、どのフレームワークが良くてどのフレームワークが悪いのかは言えないと感じています。フレームワークについては、多くのことを学ぶことができます。それに、まだ理解していないこともたくさんあるので、フレームワークをしっかり勉強すれば、まだまだ勉強になります。

まず Laravel について話しましょう。現在は 5.2 です。私自身、これまでlaravelに触れたことはなかったのですが、laravelを学んでみて、このフレームワークはとても良いものだと感じていますし、外国人も喜んで使っています。彼の開発コミュニティは大丈夫で、ドキュメントは比較的充実していますが、公式 Web サイトのドキュメントはあまり良くありません (私自身の感覚です)。多くのことについてはソース コードを読まなければなりません。私と同じように英語が苦手なので、中国語のドキュメントを好みます(後で変更する必要があります)。 Laravel は Composer (https://getcomposer.org) を使用して依存関係を管理します。これは確かに便利ですが、ミラーがブロックされているため、アクセスまたは更新が遅くなります (ほとんど失敗します)。解決策は次のとおりです。 http:// pkg.phpcomposer.com/#tip1.

最近、業務上の都合でプロジェクトを再構築する必要があり(リファクタリングする理由は言うまでもありません、誰もが理解しています)、新しいフレームワークに移行する必要があります。 Laravel は、強力なルーティング、便利な構成、可用性の高いモジュールの依存関係を備えた優れたフレームワークであり、実際に開発の労力を大幅に節約できます。私たちのプロジェクトは主にインターフェイス部分に関するものであることを考慮すると、パフォーマンスに一定の要件があり(ただし厳しいものではありません)、ルーティングは変更できず、古いロジックと互換性がある必要があるため、Laravel が第一の選択肢になります。これはインターフェイスを作成する際に必要になる問題です。たとえば、ビュー レイヤはほとんど使用されず、テスト モジュール、アップロード モジュール (ピクチャ ベッド付き)、ローカライズされたモジュール ファイル システムなどです。 , なども使っていないので、Laravelを使うのは、はっきり言って、Heのほうが重いです。そこで、Laravel ベースのフレームワークである Lumen を検討しました。フルスタック フレームワークである Laravel と比較して、Lumen ははるかにシンプルであり、Api 指向であるため、最終的に Lumen を選択しました。

Laravel は万能ではなく、長所と短所があります。たとえば、インストールされている Laravel フレームワークのデフォルトの依存関係ソース パッケージを見てみましょう。これは確かに少し大きいです。これまで、Lumen は使用中に少し不十分であることがわかりました。ビジネスロジックが複雑になるにつれて、アクセス速度も遅くなり、スリムなものやその他の軽量のものを検討することがあります。 Sina では、Yaf のファンが多く、yaf が本当に素晴らしいと評価しています。将来的には yaf に移行する必要があると考えられます。この時期に PHP7 が出たわけではありませんが、テストの結果、インターフェイスを 7 に移行すると大幅なパフォーマンスの向上が見込めるとのことですが、あえて 100% 改善することはできませんでした。まだ試してみましょう。安定するまで待ちましょう。

ここでは、Laravel でのログ記録とアップロードについて説明します。Laravel には多くの内容があるため、最初にこの記事の一部を書きます。ゆっくり。皆さんの学習に役立つよう、使用中に遭遇した問題や落とし穴についてお話します。

1.ログ

1. 説明:

ログの重要性は自明のことですが、私たちのログは手動の推奨事項、趣味、推奨事項に基づいています。インターフェースを作成するよりも、推奨事項を作成する学生の方が多いため、ログに問題があると、推奨事項が不正確になるか、推奨できなくなることさえあります。これは、ログの重要性を示しています。

Laravel フレームワークが初期化されると、そのログは非常に便利なログ管理ツールである Monolog に基づいてデフォルトで設定されます

まず最初に、PHP で比較的完全で簡単に拡張可能なロギング コンポーネントである Monolog について話しましょう。その中でも、Symfony や CakePHP などの有名な PHP フレームワークには Monolog が組み込まれています。興味のある方はぜひご覧ください。各 Logger インスタンスにはチャネルとログ プロセッサ スタックがあります。ログ レコードを追加すると、そのレコードはログ ハンドラー スタックに送信されます。 多くのロガーを作成できます各ロガーはチャネル (データベース、リクエスト、ルート) を定義し、各ロガーには多くのログ プロセッサがあります。これらのチャネルはログをフィルタリングします。 各ログプロセッサにはフォーマッタ(内蔵ログ表示フォーマットプロセッサ)があります。ログレベルを設定することもできます。 (公式サイト説明)

ログ構成: Laravel は現在 4 つのログプロセッサをサポートしています。 リーリー

ログ処理方法を理解した後、config/app.php で必要な方法を設定できます (デフォルト): リーリー

2. Log を使用してログを記録します

Laravel は、 ディレクトリにログを記録するための Log メソッドを提供します。

Log实际上使用的 IlluminateLogWriter,应为在其中 Writer 的构造函数中注入了MonologLogger。生成的日志文件存放在storage/logsは次のとおりです:

<span>1</span> <span>Log</span>::emergency(<span>$error</span>); <span>//</span><span>紧急,如系统挂掉</span>
<span>2</span> <span>Log</span>::alert(<span>$error</span>);     <span>//</span><span>需要立即采取行动,如数据库异常等</span>
<span>3</span> <span>Log</span>::critical(<span>$error</span>);  <span>//</span><span>严重问题,如异常</span>
<span>4</span> <span>Log</span>::error(<span>$error</span>);     <span>//</span><span>运行时错误,不需要立即处理但需要被记录和监控</span>
<span>5</span> <span>Log</span>::warning(<span>$error</span>);   <span>//</span><span>警告但不是错误,比如使用了被废弃的API</span>
<span>6</span> <span>Log</span>::notice(<span>$error</span>);    <span>//</span><span>普通但值得注意的事件</span>
<span>7</span> <span>Log</span>::info(<span>$error</span>);      <span>//</span><span>感兴趣的事件,比如登录、退出</span>
<span>8</span> <span>Log</span>::debug(<span>$error</span>);     <span>//</span><span>详细的调试信息</span>

3、按照自己的需求记录日志

Laravel中如果按照原来的配置貌似不能按照自己的需求记录日志,我就按照自己的需求写了一个,供大家参考,当然你可以跳过他提供的日志处理方法Log,在容器中把 Monolog对象写入容器,可以写成单例的形式,这样在加载的时候只实例化一次,然后按照monolog来配置自己想要的记录日志的方法。

<span> 1</span> <span>class</span><span> Save_log
</span><span> 2</span> <span>{
</span><span> 3</span>     <span>//</span><span>存放每个级别实例</span>
<span> 4</span>     <span>private</span> <span>static</span> <span>$obj_log</span> =<span> [];
</span><span> 5</span> 
<span> 6</span>     <span>//</span><span>日志类型映射</span>
<span> 7</span>     <span>private</span> <span>static</span> <span>$classify_arr</span> = ['default', 'debug_log','error_log'<span>];
</span><span> 8</span> 
<span> 9</span>     <span>/*</span><span>*
</span><span>10</span> <span>     * 单利初始化以及调取对象
</span><span>11</span> <span>     * @param $classify 日志的的频道,对应不同的目录
</span><span>12</span> <span>     * @param $max_num  日志记录的最大数量
</span><span>13</span>      <span>*/</span>
<span>14</span>     <span>public</span> <span>static</span> <span>function</span> get_log_instance(<span>$classify</span> = 'default', <span>$max_num</span> = 0<span>)
</span><span>15</span> <span>    {
</span><span>16</span>         <span>if</span>(<span>empty</span>(self::<span>$obj_log</span>[<span>$classify</span><span>])) {
</span><span>17</span>             self::<span>$obj_log</span>[<span>$classify</span>] = <span>new</span> Writer(<span>new</span> Logger(<span>$classify</span><span>));
</span><span>18</span>             self::<span>$obj_log</span>[<span>$classify</span>]->useDailyFiles(self::get_path(<span>$classify</span>), <span>$max_num</span><span>);
</span><span>19</span> <span>        }
</span><span>20</span>         <span>return</span> self::<span>$obj_log</span>[<span>$classify</span><span>];
</span><span>21</span> <span>    }
</span><span>22</span> 
<span>23</span>     <span>/*</span><span>*
</span><span>24</span> <span>     * 映射对应的目录
</span><span>25</span> <span>     * @param $classify 日志的不同的频道
</span><span>26</span>      <span>*/</span>
<span>27</span>     <span>private</span> <span>static</span> <span>function</span> get_path(<span>$classify</span><span>)
</span><span>28</span> <span>    {
</span><span>29</span>         <span>$root_path</span> =<span> public_path();
</span><span>30</span>         <span>$path</span> = <span>$root_path</span> . '/../../logs/'<span>; //可以是自己的任意路径
</span><span>31</span>         <span>$log_arr</span> = self::<span>$classify_arr</span><span>;
</span><span>32</span>         <span>if</span>(!<span>empty</span>(<span>$log_arr</span>) && !<span>empty</span>(<span>$classify</span><span>)) {
</span><span>33</span>             <span>if</span>(<span>in_array</span>(<span>$classify</span>, <span>$log_arr</span><span>)) {
</span><span>34</span>                 <span>return</span> <span>$path</span> . <span>$classify</span>. '/' . <span>$classify</span> . '.log'<span>;
</span><span>35</span> <span>            }
</span><span>36</span> <span>        }
</span><span>37</span>         <span>return</span> <span>$path</span> . 'default/default.log'<span>;
</span><span>38</span> <span>    }
</span><span>39</span> 
<span>40</span>     <span>/*</span><span>*
</span><span>41</span> <span>     * 映射对应的目录
</span><span>42</span> <span>     * @param $func 调用的方法
</span><span>43</span> <span>     * @param $arguments 参数,包括数据和日志等级
</span><span>44</span>      <span>*/</span>
<span>45</span>     <span>public</span> <span>static</span> <span>function</span> __callStatic(<span>$func</span>, <span>$arguments</span><span>)
</span><span>46</span> <span>    {
</span><span>47</span>         <span>$get_obj</span> = self::get_log_instance(<span>$func</span><span>);
</span><span>48</span>         <span>if</span>(<span>empty</span>(<span>$get_obj</span><span>)) {
</span><span>49</span>             <span>log</span>::error('Save Log Error!'<span>);
</span><span>50</span> <span>        }
</span><span>51</span>         <span>if</span>(<span>empty</span>(<span>$arguments</span>) || !<span>is_array</span>(<span>$arguments</span>) || !<span>isset</span>(<span>$arguments</span>[0<span>])) {
</span><span>52</span>             <span>$get_obj</span>->info('No Data Save!'<span>);
</span><span>53</span>         } <span>else</span> <span>if</span>(!<span>isset</span>(<span>$arguments</span>[1<span>])) {
</span><span>54</span>             <span>$get_obj</span>->info(<span>$arguments</span>[0<span>]);
</span><span>55</span>         } <span>else</span><span> {
</span><span>56</span>             <span>$get_obj</span>->{<span>$arguments</span>[1]}(<span>$arguments</span>[0<span>]);
</span><span>57</span> <span>        }
</span><span>58</span> <span>    }
</span><span>59</span> }

使用的时候可以指定,如下:

<span>1</span> Save_log::<span>error_log</span>(<span>$info</span>, 'error'<span>);
</span><span>2</span> Save_log::debug_log(<span>$info</span>);

日志内容如下:

二、上传文件。

Laravel中的上传文件是基于Flysystem提供的文件系统来实现上传,删除,移动。他支持多种驱动,还有一个值得看的云存储,在SAE上需要用到。

文件系统配置位于Config/filesystems.php,我使用的试本地驱动。Laravel中的上传目录有两个:public和Storage两个,有人说这两个一样,其实是有区别的,应该说是各有好处,如果放在public中,服务器可以直接控制访问,方便效率高,放在Storage中可以加上用户控制比如权限等。

上传需要的函数如下:

判断是否进行了上传,是否存在文件:

<span>1</span> <span>$request</span>->hasFile('file')

判断上传是否出错:

<span>1</span> <span>$file</span> = <span>$request</span>-><span>file</span>('file'<span>);
</span><span>2</span> <span>//</span><span>判断文件上传过程中是否出错</span>
<span>3</span> <span>if</span>(!<span>$file</span>-><span>isValid()) {
</span><span>4</span>      <span>exit</span>('文件上传出错!'<span>);
</span><span>5</span> }

确定上传:

<span>1</span> <span>$bytes</span> = Storage::<span>put(
</span><span>2</span>       <span>$savePath</span>,
<span>3</span>       <span>file_get_contents</span>(<span>$file</span>-><span>getRealPath())
</span><span>4</span> );

你也可以使用:

<span>$path</span> = <span>$file</span> -> move('storage/uploads');

生成缩略图

Laravel木有提供函数生成缩略图,但是我们可以借助强大的Composer来引入图片处理库 Integration/Image

在项目根目录中的composer.json中的require中添加:"intervention/image": "dev-master",如下图:

然后在config/app.php中providers数组中添加:

<span>1</span> Intervention\Image\ImageServiceProvider::<span>class</span>

在aliases数组中添加别名:

<span>1</span> 'Image'     => Intervention\Image\Facades\Image::<span>class</span>,

这样就可以使用了,在类文件中添加:

<span>1</span> <span>use</span> Image;

下面是添加水印并且生成缩略图:

<span>$Image</span>->text('@ u/'. <span>$user_id</span>, <span>$news_width</span> - 40 - <span>$length</span> * 10, <span>$news_height</span> - 24, <span>function</span>(<span>$font</span><span>) {
       </span><span>$font</span>-><span>file</span>('public/foos.ttf'<span>);
       </span><span>$font</span>->size(14<span>);
       </span><span>$font</span>->color('#ffffff'<span>);
 });</span>

最后附上整个源码,其中生成缩略图部分可以抽象出来,因为有好几个地方都需要用到,并且水印还有看图片大小等等。

<span>  1</span> <span>/*</span><span>*
</span><span>  2</span> <span> * 上传文件
</span><span>  3</span> <span> * @param  Object Request
</span><span>  4</span> <span> * @return Json result
</span><span>  5</span>  <span>*/</span>
<span>  6</span> <span>public</span> <span>function</span> upload_file(Request <span>$request</span><span>)
</span><span>  7</span> <span>{
</span><span>  8</span>     <span>$user_id</span> = <span>$request</span>->get('user_id'<span>);
</span><span>  9</span>     <span>$width</span> = <span>$request</span>->get('width'<span>);
</span><span> 10</span>     <span>$height</span> = <span>$request</span>->get('height'<span>);
</span><span> 11</span>     <span>$upload_type</span> = <span>$request</span>->get('upload_type'<span>);
</span><span> 12</span>     <span>$watermark</span> = <span>$request</span>->get('watermark'<span>);
</span><span> 13</span> 
<span> 14</span>     <span>//</span><span>参数检查</span>
<span> 15</span>     <span>if</span>(<span>empty</span>(<span>$user_id</span><span>)) {
</span><span> 16</span>         <span>return</span> response()->json(['code' => 1001, 'msg' => '参数错误'<span>]);
</span><span> 17</span> <span>    }
</span><span> 18</span> 
<span> 19</span>     <span>//</span><span>得到上传文件名</span>
<span> 20</span>     <span>if</span>(!<span>empty</span>(<span>$_FILES</span><span>)) {
</span><span> 21</span>         <span>$key_arr</span> =  <span>array_keys</span>(<span>$_FILES</span><span>);
</span><span> 22</span>         <span>$file_key</span> = <span>$key_arr</span>[0<span>];
</span><span> 23</span> <span>    }
</span><span> 24</span>     
<span> 25</span>     <span>$file_key</span> = !<span>isset</span>(<span>$file_key</span>) || <span>empty</span>(<span>$file_key</span>) ? 'fileselect' : <span>$file_key</span><span>;
</span><span> 26</span> 
<span> 27</span>     <span>if</span>(!<span>$request</span>->hasFile(<span>$file_key</span><span>)) {
</span><span> 28</span>         <span>return</span> response()->json(['code' => 1002, 'msg' => '上传文件为空'<span>]);
</span><span> 29</span> <span>    }
</span><span> 30</span> 
<span> 31</span>     <span>$upload_files</span> = <span>$request</span>-><span>file</span><span>();
</span><span> 32</span>     <span>if</span>(<span>empty</span>(<span>$upload_files</span>) || !<span>is_array</span>(<span>$upload_files</span><span>)) {
</span><span> 33</span>         <span>return</span> response()->json(['code' => 1003, 'msg' => '上传失败'<span>]);
</span><span> 34</span> <span>    }
</span><span> 35</span> 
<span> 36</span>     <span>//</span><span>兼容单文件上传</span>
<span> 37</span>     <span>if</span>(Utils::arrayLevel(<span>$upload_files</span>) < 2<span>) {
</span><span> 38</span>         <span>$files</span>[<span>$file_key</span>][0] = <span>$upload_files</span>[<span>$file_key</span><span>];
</span><span> 39</span>     } <span>else</span><span> {
</span><span> 40</span>         <span>$files</span> = <span>$upload_files</span><span>;
</span><span> 41</span> <span>    }
</span><span> 42</span> 
<span> 43</span>     <span>if</span>(<span>$upload_type</span> == 'userphoto' && <span>count</span>(<span>$files</span>[<span>$file_key</span>]) > 1<span>) {
</span><span> 44</span>         <span>return</span> response()->json(['code' => 1004, 'msg' => '头像只能上传一张'<span>]);
</span><span> 45</span> <span>    }
</span><span> 46</span> 
<span> 47</span>     <span>if</span>(<span>count</span>(<span>$files</span>[<span>$file_key</span>]) ><span> MAX_UPLOAD_FILE) {
</span><span> 48</span>         <span>return</span> response()->json(['code' => 1005, 'msg' => '大于最大上传数限制'<span>]);
</span><span> 49</span> <span>    }
</span><span> 50</span> 
<span> 51</span>     <span>//</span><span>过滤大于MAX_FILE_SIZE的情况</span>
<span> 52</span>     <span>foreach</span> (<span>$files</span>[<span>$file_key</span>] <span>as</span> <span>$key</span> => <span>$file</span><span>) {
</span><span> 53</span>         <span>if</span>(<span>$file</span>-> getClientSize() > MAX_FILE_SIZE * 1024 * 1024<span>) {
</span><span> 54</span>             <span>return</span> response()->json(['code' => 1006, 'msg' => '文件大小不能超过'<span>]);
</span><span> 55</span> <span>        }
</span><span> 56</span> <span>    }
</span><span> 57</span> 
<span> 58</span>     <span>$file_info</span> =<span> [];
</span><span> 59</span>     <span>$length</span> = <span>strlen</span>(<span>$user_id</span> . ''<span>);
</span><span> 60</span>     <span>//</span><span>兼容批量上传</span>
<span> 61</span>     <span>foreach</span> (<span>$files</span>[<span>$file_key</span>] <span>as</span> <span>$key</span> => <span>$file</span><span>) {
</span><span> 62</span>         <span>if</span>(!<span>$file</span>-><span>isValid()) {
</span><span> 63</span>             <span>return</span> response()->json(['code' => 1007, 'msg' => '上传出错'<span>]);
</span><span> 64</span> <span>        }
</span><span> 65</span> 
<span> 66</span>         <span>if</span>(<span>$upload_type</span> == 'userpic'<span>) {
</span><span> 67</span>             <span>$file_dir</span> = 'userpic'<span>;
</span><span> 68</span>         } <span>else</span><span> {
</span><span> 69</span>             <span>$type</span> = <span>$file</span>-><span>getMimeType();
</span><span> 70</span>             <span>if</span>(<span>empty</span>(<span>$type</span>) && !<span>is_array</span>(<span>$type</span><span>)) {
</span><span> 71</span>                 <span>return</span> response()->json(['code' => 1008, 'msg' => '得到文件类型出错'<span>]);
</span><span> 72</span> <span>            }
</span><span> 73</span> 
<span> 74</span>             <span>//</span><span>映射文件类型</span>
<span> 75</span>             <span>$type_arr</span> = <span>explode</span>("/", <span>$type</span><span>);
</span><span> 76</span>             <span>switch</span>(<span>$type_arr</span>[0<span>]){
</span><span> 77</span>                 <span>case</span> "image"      : <span>$file_dir</span> = "image"; <span>break</span><span>;
</span><span> 78</span>                 <span>case</span> "video"      : <span>$file_dir</span> = "video"; <span>break</span><span>;
</span><span> 79</span>                 <span>case</span> "audio"      : <span>$file_dir</span> = "voice"; <span>break</span><span>;
</span><span> 80</span>                 <span>case</span> "text"       : <span>$file_dir</span> = "doc";   <span>break</span><span>;
</span><span> 81</span>                 <span>case</span> "application": <span>$file_dir</span> = "doc";   <span>break</span><span>;
</span><span> 82</span>                 <span>default</span>           : <span>$file_dir</span> = "other"; <span>break</span><span>;
</span><span> 83</span> <span>            }
</span><span> 84</span> <span>        }
</span><span> 85</span> 
<span> 86</span>         <span>//</span><span>文件后缀</span>
<span> 87</span>         <span>$postfix</span> = <span>$file</span>-><span>getClientOriginalExtension();
</span><span> 88</span>         <span>$save_dir</span> =<span> UPLOAD_FILE_PATH;
</span><span> 89</span>         <span>$file_date</span> = <span>date</span>('Ym'<span>);
</span><span> 90</span>         <span>$file_name</span> = <span>$file_dir</span> . '_' . <span>$file_date</span> . '_' . <span>rand</span>(111111, 999999) . <span>$user_id</span><span>;
</span><span> 91</span>         <span>$save_name</span> = <span>$file_name</span> . '.' . <span>$postfix</span><span>;
</span><span> 92</span>         <span>$save_path</span> = <span>$file_dir</span> . '/' . <span>$file_date</span> . '/' . <span>$save_name</span><span>;
</span><span> 93</span>         Storage::<span>put(
</span><span> 94</span>             <span>$save_path</span>, 
<span> 95</span>             <span>file_get_contents</span>(<span>$file</span>-><span>getRealPath())
</span><span> 96</span> <span>        );
</span><span> 97</span>         <span>if</span>(!Storage::exists(<span>$save_path</span><span>)) {
</span><span> 98</span>             <span>return</span> response()->json(['code' => 1009, 'msg' => '保存文件失败'<span>]);
</span><span> 99</span> <span>        }
</span><span>100</span> 
<span>101</span>         <span>//</span><span>生成缩略图</span>
<span>102</span>         <span>if</span>(<span>$file_dir</span> == 'image' && (!<span>empty</span>(<span>$width</span>) || !<span>empty</span>(<span>$height</span><span>))) {
</span><span>103</span>             <span>$Image</span> = Image::make(<span>$save_dir</span> . <span>$save_path</span><span>);
</span><span>104</span>             <span>$img_width</span> = <span>$Image</span>-><span>width();
</span><span>105</span>             <span>$img_height</span> = <span>$Image</span>-><span>height();
</span><span>106</span> 
<span>107</span>             <span>//</span><span>如果有一个为空,则与另一个相等;</span>
<span>108</span>             <span>if</span>(<span>empty</span>(<span>$width</span><span>)) {
</span><span>109</span>                 <span>//</span><span>传入的高度如果比实际高度大,就取实际高度</span>
<span>110</span>                 <span>$height</span> = <span>$img_height</span> < <span>$height</span> ? <span>$img_height</span> : <span>$height</span><span>;
</span><span>111</span>                 <span>$width</span> = <span>$height</span><span>;
</span><span>112</span>             } <span>else</span> <span>if</span>(<span>empty</span>(<span>$height</span><span>)) {
</span><span>113</span>                 <span>$width</span> = <span>$img_width</span> < <span>$width</span> ? <span>$img_width</span> : <span>$width</span><span>;
</span><span>114</span>                 <span>$height</span> = <span>$width</span><span>;
</span><span>115</span>             } <span>else</span><span> {
</span><span>116</span>                 <span>$height</span> = <span>$img_height</span> < <span>$height</span> ? <span>$img_height</span> : <span>$height</span><span>;
</span><span>117</span>                 <span>$width</span> = <span>$img_width</span> < <span>$width</span> ? <span>$img_width</span> : <span>$width</span><span>;
</span><span>118</span> <span>            }
</span><span>119</span> 
<span>120</span>             <span>//</span><span>拼接缩略图路径</span>
<span>121</span>             <span>$Image</span>->resize(<span>$width</span>, <span>$height</span><span>);
</span><span>122</span>             <span>$save_name_s</span> = <span>$file_name</span> . '_s.' . <span>$postfix</span><span>;
</span><span>123</span>             <span>$save_path_s</span> = <span>$save_dir</span> . <span>$file_dir</span> . '/' . <span>$file_date</span> . '/' . <span>$save_name_s</span><span>;
</span><span>124</span>             <span>$file_path_s</span> = <span>$request</span>->root() . '/' . <span>$save_path_s</span><span>;
</span><span>125</span> 
<span>126</span>             <span>if</span>(<span>$watermark</span> != 1<span>) {
</span><span>127</span>                 <span>//</span><span>添加缩略图水印</span>
<span>128</span>                 <span>$news_width</span> = <span>$Image</span>-><span>width();
</span><span>129</span>                 <span>$news_height</span> = <span>$Image</span>-><span>height();
</span><span>130</span>                 <span>if</span>(<span>$news_width</span> > 100<span>) {
</span><span>131</span>                     <span>$Image</span>->text('@ u/'. <span>$user_id</span>, <span>$news_width</span> - 40 - <span>$length</span> * 10, <span>$news_height</span> - 24, <span>function</span>(<span>$font</span><span>) {
</span><span>132</span>                         <span>$font</span>-><span>file</span>('public/foos.ttf'<span>);
</span><span>133</span>                         <span>$font</span>->size(14<span>);
</span><span>134</span>                         <span>$font</span>->color('#ffffff'<span>);
</span><span>135</span> <span>                    });
</span><span>136</span> <span>                }
</span><span>137</span> <span>            }
</span><span>138</span> 
<span>139</span>             <span>//</span><span>保存缩略图</span>
<span>140</span>             <span>$Image</span>->save(<span>$save_path_s</span>, 100<span>);
</span><span>141</span>             <span>$file_size_s</span> = <span>round</span>(<span>$Image</span>-><span>filesize</span>() / 1024 ,2) . 'K'<span>;
</span><span>142</span> <span>        }
</span><span>143</span> 
<span>144</span>         <span>$file_path</span> = <span>$request</span>->root() . '/' . <span>$save_dir</span> . <span>$save_path</span><span>;
</span><span>145</span>         <span>$file_size</span> = <span>round</span>(<span>$file</span>-> getClientSize() / 1024 ,2) . 'K'<span>;
</span><span>146</span>         <span>$file_info</span>[] = <span>compact</span><span>(
</span><span>147</span>             'save_name', 'file_size', 'file_path', 'save_name_s', 'file_size_s', 'file_path_s'
<span>148</span> <span>        );
</span><span>149</span> <span>    }
</span><span>150</span> 
<span>151</span>     <span>if</span>(<span>empty</span>(<span>$file_info</span><span>)) {
</span><span>152</span>         <span>return</span> response()->json(['code' => 1010, 'msg' => '异常出错'<span>]);
</span><span>153</span>     } <span>else</span><span> {
</span><span>154</span>         <span>return</span> response()->json(['code' => 0, 'msg' => '', 'data' => <span>$file_info</span><span>]);
</span><span>155</span> <span>    }
</span><span>156</span> }

结束语:

以上是我学习中遇到的一部分问题,不对之处欢迎指正,这篇文章只是说了日志和上传,以后会持续更新,包括路由,中间件,容器等等,还有好多需要说的。另外会同步更新到我的个人网站:www.zhaoyafei.cn,欢迎访问

转载注明出处

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1084383.htmlTechArticleLaravel中的日志与上传, PHP中的框架众多,我自己就接触了好几个。大学那会啥也不懂啥也不会,拿了一个ThinkPHP学了。也许有好多人吐槽...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。