Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiel für das Hochladen einer einzelnen Datei auf yii2.0 oss

Beispiel für das Hochladen einer einzelnen Datei auf yii2.0 oss

巴扎黑
巴扎黑Original
2017-09-21 10:10:391198Durchsuche

In diesem Artikel wird hauptsächlich das Beispiel der Integration von Alibaba Cloud oss ​​durch Yii2.0 zum Hochladen einer einzelnen Datei vorgestellt. Der Herausgeber findet es recht gut, daher werde ich es jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Editor und werfen wir einen Blick darauf.

Im vorherigen Artikel wurde erläutert, wie man Alibaba Cloud oss ​​integriert. In diesem Artikel wird hauptsächlich das Hochladen von Dateien in Alibaba Cloud oss ​​vorgestellt.

Die Hauptidee: Laden Sie zuerst die Datei auf den Server hoch und übertragen Sie sie dann auf den Server von Alibaba Cloud. Bei Erfolg werden die Dateiinformationen in die Datenbank geschrieben Die Datei wird gelöscht.

Hauptschritte:

0 Einführung mehrerer Oss-Konzepte.

accessKeyId ==>> Es kann als das Konto verstanden werden, das für den Zugriff auf Alibaba Cloud OSS verwendet wird.

accessKeySecret ==>gt;> Es kann als das für den Zugriff verwendete Passwort verstanden werden Alibaba Cloud OSS

Bucket ==>> Es kann als das Stammverzeichnis verstanden werden, in dem die Datei gespeichert wird

endPoint ==> Cloud-Bilder Weg.

object ==>gt;> Wie lauten der Pfad und der Name Ihrer Datei nach der Übertragung in Alibaba Cloud?

Anhand des Screenshots ist es einfacher zu verstehen:

1 Das Hochladen von Dateien beinhaltet immer noch mvc. Diesmal beginnt es mit der Ansicht, die hauptsächlich ein Formular zum Senden von Dateien anzeigt. Der aliyunoss.php-Code lautet wie folgt:


<?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 Empfangen Sie die Datei im Controller und übertragen Sie sie zur Verarbeitung an das Modell. Der Beispielcode von UploadController lautet wie folgt:


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 Wenn der Controller das Bild in die Modelldatei UploadForm.php überträgt, muss er die Datei zunächst in die Datei verschieben Laden Sie dann das Verzeichnis des Servers hoch. Der Code lautet wie folgt:


<?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);
  }
}

Wenn Sie auf eine Fehlermeldung stoßen, die besagt, dass keine Dateien hochgeladen wurden, liegt dies höchstwahrscheinlich daran, dass die Bildüberprüfungsregeleinstellung „maxFiles“ größer als ist 1. Ändern Sie es einfach in 1. .

Bitte beachten Sie, dass der obige Code in der lokalen Testumgebung einen Timeout-Fehler bei der Curl-Verbindung meldet, bei der Ausführung auf dem Server jedoch kein Problem auftritt.

Das obige ist der detaillierte Inhalt vonBeispiel für das Hochladen einer einzelnen Datei auf yii2.0 oss. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn