ホームページ  >  記事  >  バックエンド開発  >  Alibaba Cloud oss を yii2.0 と統合して単一のファイルをアップロードする方法

Alibaba Cloud oss を yii2.0 と統合して単一のファイルをアップロードする方法

黄舟
黄舟オリジナル
2017-09-20 09:15:571542ブラウズ

この記事では主に、Alibaba Cloud oss を統合して 1 つのファイルをアップロードする Yii2.0 の例を紹介します。編集者はそれが非常に優れていると考えたので、参考として共有します。編集者をフォローして見てみましょう

前回の記事では、Alibaba Cloud oss の統合方法を紹介しましたが、この記事では主に Alibaba Cloud oss へのファイルのアップロードについて紹介します。

主なアイデア: まず、ファイルをサーバーにアップロードする必要があります。次に、サーバー内のファイルを Alibaba Cloud oss に転送する必要があります。失敗した場合は、ファイル情報がデータベースに書き込まれます。サーバーファイルが削除されます。

主な手順:

0 いくつかの oss の概念を紹介します。

accessKeyId ==> 保存されたルート ディレクトリ

endPoint ==>> これをスペースと ossfile の間に配置して、ファイルにアクセスするための URL パスを形成します。これは、Alibaba Cloud の画像を取得する方法でもあります。

object ==>> ファイルが Alibaba Cloud oss に転送された後のパスと名前は何ですか?

スクリーンショットを見ると理解しやすいです:


1 ファイルのアップロードにはまだ作業が必要です今回は mvc ビューから始まり、主にファイルを送信するためのフォームを表示します。 aliyunoss.php コードは次のとおりです:

<?php
use yii\widgets\ActiveForm;
?>

<?php $form = ActiveForm::begin([&#39;options&#39; => [&#39;enctype&#39; => &#39;multipart/form-data&#39;]]) ?>

<?= $form->field($model, &#39;files&#39;)->fileInput() ?>

  <button>Submit</button>

<?php ActiveForm::end() ?>

2 コントローラーでファイルを受信し、処理のためにモデルに転送します。 UploadController のサンプル コードは次のとおりです。


public function actionTestAliyun()
  {
    $model = new UploadForm(); // 实例化上传类
    if (Yii::$app->request->isPost) {
      $model->files = UploadedFile::getInstance($model,&#39;files&#39;); //使用UploadedFile的getInstance方法接收单个文件

      $model->setScenario(&#39;upload&#39;); // 设置upload场景
      $res = $model->uploadfile(); //调用model里边的upload方法执行上传
      $err = $model->getErrors(); //获取错误信息

      echo "<pre class="brush:php;toolbar:false">";
      print_r($res); //打印上传结果
      print_r($err); //打印错误信息,方便排错
      exit;

    }

    return $this->render(&#39;aliyunoss&#39;,[&#39;model&#39;=>$model]);
  }

3 コントローラーが画像をモデル ファイル UploadForm.php に転送した後、まずファイルをサーバーのアップロード ディレクトリに移動し、次に Alibaba に移動する必要があります。雲。コードは次のとおりです:


<?php
/**
 * Created by PhpStorm.
 * Description: 阿里oss上传图片
 * Author: Weini
 * Date: 2016/11/17 0017
 * Time: 上午 11:34
 */

namespace app\models;

use Yii;
use yii\base\Exception;
use yii\base\Model;

class UploadForm extends Model
{
  public $files; //用来保存文件

  public function scenarios()
  {
    return [
      &#39;upload&#39; => [&#39;files&#39;], // 添加上传场景
    ];
  }

  public function rules(){
    return [
      [[&#39;files&#39;],&#39;file&#39;, &#39;skipOnEmpty&#39; => false, &#39;extensions&#39; => &#39;jpg, png, gif&#39;, &#39;mimeTypes&#39;=>&#39;image/jpeg, image/png, image/gif&#39;, &#39;maxSize&#39;=>1024*1024*10, &#39;maxFiles&#39;=>1, &#39;on&#39;=>[&#39;upload&#39;]],
      //设置图片的验证规则
    ];
  }

  /**
   * 上传单个文件到阿里云
   * @return boolean 上传是否成功
   */
  public function uploadfile(){
    $res[&#39;error&#39;] = 1;

    if ($this->validate()) {
      $uploadPath = dirname(dirname(__FILE__)).&#39;/web/uploads/&#39;; // 取得上传路径
      if (!file_exists($uploadPath)) {
        @mkdir($uploadPath, 0777, true);
      }

      $ext = $this->files->getExtension();        // 获取文件的扩展名
      $randnums = $this->getrandnums();          // 生成一个随机数,为了重命名文件
      $imageName = date("YmdHis").$randnums.&#39;.&#39;.$ext;   // 重命名文件
      $ossfile = &#39;file/&#39;.date("Ymd").&#39;/&#39;.$imageName;   // 这里是保存到阿里云oss的文件名和路径。如果只有文件名,就会放到空间的根目录下。
      $filePath = $uploadPath.$imageName;         // 生成文件的绝对路径

      if ($this->files->saveAs($filePath)){        // 上传文件到服务器
        $filedata[&#39;filename&#39;] = $imageName;       // 准备图片信息,保存到数据库
        $filedata[&#39;filePath&#39;] = $filePath;       // 准备图片信息,保存到数据库
        $filedata[&#39;ossfile&#39;] = $ossfile;        // 准备图片信息,保存到数据库
        $filedata[&#39;userid&#39;] = Yii::$app->user->id;   // 准备图片信息,保存到数据库,这个字段必须要,以免其他用户恶意删除别人的图片
        $filedata[&#39;uploadtime&#39;] = time();        // 准备图片信息,保存到数据库

        // 上边这些代码不能照搬,要根据你项目的需求进行相应的修改。反正目的就是记录上传文件的信息
        // 老板,这些代码是我搬来的,没仔细看,如果出问题了,你就扣我的奖金吧^_^

        $trans = Yii::$app->db->beginTransaction();   // 开启事务
        try{
          $savefile = Yii::$app->db->createCommand()->insert(&#39;file&#39;, $filedata)->execute(); //把文件的上传信息写入数据库
          $newid = Yii::$app->db->getLastInsertID(); //获取新增文件的id,用于返回。

          if ($savefile) {              // 如果插入数据库成功
            $ossupload = Yii::$app->Aliyunoss->upload($ossfile, $filePath); //调用Aliyunoss组件里边的upload方法把文件上传到阿里云oss

            if ($ossupload) {            // 如果上传成功,
              $res[&#39;error&#39;] = 0;         // 准备返回信息
              $res[&#39;fileid&#39;] = $newid;      // 准备返回信息
              $res[&#39;ossfile&#39;] = $ossfile;     // 准备返回信息
              $trans->commit();          // 提交事务
            } else {                // 如果上传失败
              unlink($filePath);         // 删除服务器上的文件
              $trans->rollBack();         // 事务回滚
            }
          }
          unlink($filePath);             // 插入数据库失败,删除服务器上的文件
          $trans->rollBack();             // 事务回滚
        } catch(Exception $e) {             // 出了异常
          unlink($filePath);             // 删除服务器上的文件
          $trans->rollBack();             // 事务回滚
        }

      }
    }

    return $res;                      // 返回上传信息
  }

  /**
   * 生成随机数
   * @return string 随机数
   */
  protected function getrandnums()
  {
    $arr = array();
    while (count($arr) < 10) {
      $arr[] = rand(1, 10);
      $arr = array_unique($arr);
    }
    return implode("", $arr);
  }
}

ファイルがアップロードされていないというエラーが発生した場合は、イメージ検証ルールの maxFiles 設定が 1 より大きいことが原因である可能性が高く、これを 1 に変更するだけです。


上記のコードはローカルのテスト環境ではcurl接続タイムアウトエラーを報告しますが、サーバー上で実行する場合は問題ないことに注意してください。

以上がAlibaba Cloud oss を yii2.0 と統合して単一のファイルをアップロードする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。