Yii2在API中将图像发布到模型,而不使用Yii2命名约定
我正在为移动应用程序创建一个端点,以便将图像发送到服务器。我正在发布带有chrome邮递员分机的图像。图像位于Yii2在API中将图像发布到模型,而不使用Yii2命名约定,yii2,Yii2,我正在为移动应用程序创建一个端点,以便将图像发送到服务器。我正在发布带有chrome邮递员分机的图像。图像位于$\u文件变量中,名为image。如何将此图像加载到模型或UploadedFile类中?$model->load(Yii::$app->request->post())行未正确加载文件,因为它不在Yii2的表单命名约定中 它目前正在返回: { "success": false, "message": "Required parameter 'image' is not s
$\u文件
变量中,名为image
。如何将此图像加载到模型或UploadedFile
类中?$model->load(Yii::$app->request->post())
行未正确加载文件,因为它不在Yii2的表单命名约定中
它目前正在返回:
{
"success": false,
"message": "Required parameter 'image' is not set."
}
代码
models\Image.php
您的问题似乎是用于发送图像文件的名称。通常,Yii2使用表单属性的名称,如“ModelName[attributeName]”,您发送的图像文件名为“image”
有两种方法可以解决此问题:
更改用于发送图像文件的名称,以遵循相同的命名约定。然而,你似乎不想这样
使用getInstanceByName('image')
方法,而不是getInstance($model,'image')
问题来了
当您通过api发送文件时,它们不会异步发送。如果你查一下
echo '<pre>';
print_r($_FILES); //returns nothing
print_r($_POST["image"]); //returns something
echo '</pre>';
die;
然后在ajax帖子上
我希望这有帮助您在第2点中提供的功能正是我想要的。非常感谢。
<?php
namespace api\modules\v1\controllers;
use api\modules\v1\models\Image;
use yii\web\Controller;
use yii\web\UploadedFile;
use Yii;
class DefaultController extends Controller
{
public $enableCsrfValidation = false;
public function actionIndex()
{
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$model = new Image();
if (Yii::$app->request->isPost) {
if($model->load(Yii::$app->request->post()))
{
$model->image = UploadedFile::getInstance($model, 'image');
if ($model->upload()) {
// file is uploaded successfully
return ['success' => true, 'message' => 'File saved.'];
}
else return ['success' => false, 'message' => 'Could not save file.'];
}
else return ['success' => false, 'message' => 'Required parameter \'image\' is not set.'];
}
else return ['success' => false, 'message' => 'Not a POST request.'];
}
}
echo '<pre>';
print_r($_FILES); //returns nothing
print_r($_POST["image"]); //returns something
echo '</pre>';
die;
The form
<?php $form = ActiveForm::begin(['options' => ['enctype' =>
'multipart/form-data','id'=>'slider_form']]); ?> //dont forget enctype
<?= $form->field($model, 'file')->fileInput() ?>
var formData = new FormData($('form#slider_form')[0].files);
$.post(
href, //serialize Yii2 form
{other atributes ,formData:formData}
)
Then on the controller simply access via
$model->file =$_FILES["TblSlider"]; //here this depends on your form attributes check with var_dump($_FILES)
$file_tmp = $_FILES["TblSlider"]["tmp_name"]["file"];
$file_ext = pathinfo($_FILES['TblSlider']['name']["file"], PATHINFO_EXTENSION);
if(!empty($model->file)){
$filename = strtotime(date("Y-m-d h:m:s")).".".$file_ext;
move_uploaded_file($file_tmp, "../uploads/siteimages/slider/".$filename);
///move_uploaded_file($file_tmp, Yii::getAlias("@uploads/siteimages/slider/").$filename);
$model->image = $filename;
}