이 글에서는 Yii2.0에 Alibaba Cloud oss를 통합하여 단일 파일을 업로드하는 사례를 주로 소개합니다. 편집자는 꽤 좋다고 생각하여 지금 공유하고 참고용으로 제공하겠습니다. 에디터를 따라가서 살펴볼까요
이전 글에서는 Alibaba Cloud oss 통합 방법을 소개했습니다. 이번 글에서는 주로 Alibaba Cloud oss에 파일을 업로드하는 방법을 소개합니다.
주요 아이디어: 먼저 파일을 서버에 업로드한 다음 서버에 있는 파일을 Alibaba Cloud oss로 전송해야 합니다. 성공하면 파일 정보가 데이터베이스에 기록됩니다. 서버 파일이 삭제됩니다.
주요 단계:
0 여러 OSS 개념을 소개합니다.
accessKeyId ==> 저장된 루트 디렉터리
endPoint ==>> 파일에 액세스하기 위한 URL 경로를 형성하는 공백과 ossfile 사이에 넣으며 Alibaba Cloud 사진을 얻는 방법이기도 합니다.
object ==>> 파일이 Alibaba Cloud oss로 전송된 후 경로와 이름은 무엇입니까?
스크린샷을 보면 더 쉽게 이해할 수 있습니다.<?php use yii\widgets\ActiveForm; ?> <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> <?= $form->field($model, 'files')->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,'files'); //使用UploadedFile的getInstance方法接收单个文件 $model->setScenario('upload'); // 设置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('aliyunoss',['model'=>$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 [ 'upload' => ['files'], // 添加上传场景 ]; } public function rules(){ return [ [['files'],'file', 'skipOnEmpty' => false, 'extensions' => 'jpg, png, gif', 'mimeTypes'=>'image/jpeg, image/png, image/gif', 'maxSize'=>1024*1024*10, 'maxFiles'=>1, 'on'=>['upload']], //设置图片的验证规则 ]; } /** * 上传单个文件到阿里云 * @return boolean 上传是否成功 */ public function uploadfile(){ $res['error'] = 1; if ($this->validate()) { $uploadPath = dirname(dirname(__FILE__)).'/web/uploads/'; // 取得上传路径 if (!file_exists($uploadPath)) { @mkdir($uploadPath, 0777, true); } $ext = $this->files->getExtension(); // 获取文件的扩展名 $randnums = $this->getrandnums(); // 生成一个随机数,为了重命名文件 $imageName = date("YmdHis").$randnums.'.'.$ext; // 重命名文件 $ossfile = 'file/'.date("Ymd").'/'.$imageName; // 这里是保存到阿里云oss的文件名和路径。如果只有文件名,就会放到空间的根目录下。 $filePath = $uploadPath.$imageName; // 生成文件的绝对路径 if ($this->files->saveAs($filePath)){ // 上传文件到服务器 $filedata['filename'] = $imageName; // 准备图片信息,保存到数据库 $filedata['filePath'] = $filePath; // 准备图片信息,保存到数据库 $filedata['ossfile'] = $ossfile; // 准备图片信息,保存到数据库 $filedata['userid'] = Yii::$app->user->id; // 准备图片信息,保存到数据库,这个字段必须要,以免其他用户恶意删除别人的图片 $filedata['uploadtime'] = time(); // 准备图片信息,保存到数据库 // 上边这些代码不能照搬,要根据你项目的需求进行相应的修改。反正目的就是记录上传文件的信息 // 老板,这些代码是我搬来的,没仔细看,如果出问题了,你就扣我的奖金吧^_^ $trans = Yii::$app->db->beginTransaction(); // 开启事务 try{ $savefile = Yii::$app->db->createCommand()->insert('file', $filedata)->execute(); //把文件的上传信息写入数据库 $newid = Yii::$app->db->getLastInsertID(); //获取新增文件的id,用于返回。 if ($savefile) { // 如果插入数据库成功 $ossupload = Yii::$app->Aliyunoss->upload($ossfile, $filePath); //调用Aliyunoss组件里边的upload方法把文件上传到阿里云oss if ($ossupload) { // 如果上传成功, $res['error'] = 0; // 准备返回信息 $res['fileid'] = $newid; // 准备返回信息 $res['ossfile'] = $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로 변경하면 됩니다.
위 코드는 로컬 테스트 환경에서는 컬 연결 시간 초과 오류를 보고하지만, 서버에서 실행할 때는 문제가 없다는 점 참고해주세요.
위 내용은 Alibaba Cloud oss를 yii2.0과 통합하여 단일 파일을 업로드하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!