#php #yii #image-uploading
#php #yii #загрузка изображений
Вопрос:
я прочитал эту статью http://yiiframework.com/wiki/2 и я сделал все шаг за шагом. но это не работает! это модель, которую я просто копирую, а затем вставляю :
class Item extends CActiveRecord
{
public $image;
// ... other attributes
public function rules()
{
return array(
array('image', 'file', 'types'=>'jpg, gif, png'),
);
}
}
мой взгляд точно такой же, как в статье :
$form = $this->beginWidget(
'CActiveForm',
array(
'id' => 'upload-form',
'enableAjaxValidation' => false,
'htmlOptions' => array('enctype' => 'multipart/form-data'),
)
);
// ...
echo $form->labelEx($model, 'image');
echo $form->fileField($model, 'image');
echo $form->error($model, 'image');
// ...
echo CHtml::submitButton('Submit');
$this->endWidget();
и мой контроллер :
class ItemController extends CController
{
public function actionCreate()
{
$model=new Item;
if(isset($_POST['Item']))
{
$model->attributes=$_POST['Item'];
$model->image=CUploadedFile::getInstance($model,'image');
if($model->save())
{
$model->image->saveAs(dirname(__FILE__).'/a.txt');
// redirect to success page
}
}
$this->render('create', array('model'=>$model));
}
}
когда я выбираю изображение (jpg, png или что-то еще), контроллер не видит мой файл, я имею в виду, isset($_FILES['Item'])
имеет значение false … я знаю, что это false, потому что я проверял это с помощью var_dump
сотен раз :
public function actionCreate()
{
$model=new Item;
var_dump(isset($_POST['Item']));
...
я также проверяю, var_dump(isset($_FILES['Item']))
который также был false .
для всех типов файлов (кроме обычного текстового файла) $_POST['Item']
) остается пустым.
я проверил свой запрос с помощью сетевой панели firebug (как Firefox, так и chrome), и в запросе был файл. я уже проверял этот вопрос, кажется, это та же проблема, но ответы были бесполезны, потому что CUploadedFile::getInstance
и CUploadedFile::getInstanceByName
также возвращают null для моего случая
что вы думаете?
Ответ №1:
Проблема не была связана с Yii Framework или моим php-кодом, потому что я просто тестирую один и тот же код на двух разных машинах, и это работает просто отлично. я использую wamp на своем собственном компьютере, и я предполагаю, что проблема была связана с конфигурациями Apache или php.
Ответ №2:
В контроллере измените и используйте следующим образом:
class ItemController extends CController
{
public function actionCreate()
{
$model=new Item;
if(isset($_POST['Item']))
{
$model->attributes=$_POST['Item'];
$uploadedFile = CUploadedFile::getInstance($model,'image');
if($model->save())
{
if(!empty($uploadedFile)) // check if uploaded file is set or not
{
if($model->image == null || empty($model->image)){
$rnd = rand(0,9999);// generate random number between 0-9999
$fileName = "{$rnd}-{$uploadedFile}";
$model->image = $fileName;
}
$uploadedFile->saveAs(dirname(__FILE__)..'/images/'. $model->image);
// redirect to success page
}
}
}
$this->render('create', array('model'=>$model));
}
}