如何使用PHP(Yii2框架)实现本地图片直接上传至Cloudinary服务器
错误原因
你直接将Yii2的UploadedFile实例传入Cloudinary的上传方法,API会将对象转义为文件名当成URL解析,因此抛出Unsupported source URL报错。
解决方案
你不需要手动将文件持久化到自有服务器再删除,PHP处理表单上传时会自动生成临时文件,存储在系统临时目录中,请求结束后会自动销毁,直接调用临时文件路径上传即可,全程不会在你的服务器产生持久化文件,完全符合需求。
修改后的控制器代码如下:
public function actionCreate() { $model = new Galerias(); // 初始化cloudinary $config = Configuration::instance(); $config->cloud->cloudName = 'cloudName'; $config->cloud->apiKey = 'yayaiknow'; $config->cloud->apiSecret = 'gogogodude'; $config->url->secure = true; // 正在执行上传 if ($model->load(Yii::$app->request->post())) { if($model->validate()) { $image = UploadedFile::getInstance($model, 'image'); // 传入临时文件路径上传,接收返回结果 $uploadResult = (new UploadApi())->upload($image->tempName); // 取Cloudinary返回的HTTPS图片地址存入模型 $model->image = $uploadResult['secure_url']; $model->created_at = date('Y-m-d h:i:s'); $model->updated_at = null; if($model->save()){ return $this->redirect(['view', 'id' => $model->id]); } } } return $this->render('create', [ 'model' => $model, ]); }
补充说明
- 现有表单代码无需做任何修改,保持
enctype = multipart/form-data配置即可正常使用 - 临时文件由PHP自动管理,无需手动创建或删除,无多余操作步骤
- 若需要自定义图片文件名、分类目录等参数,可在
upload方法第二个参数传入配置数组即可
内容的提问来源于stack exchange,提问作者Coyas
相关产品推荐
相关产品推荐

