messema
(Emaxmex)
July 19, 2013, 8:11am
1
Salve a tutti,
devo conservare un file .html di tipo varbinary(MAX) su database sqlserver, ma ricevo un errore al salvataggio.
Per il codice mi sono rifatto a questo esempio: http://www.yiiframework.com/wiki/95/saving-files-to-a-blob-field-in-the-database/
E’ un problema di codice o un bug?
Nella view ho:
'htmlOptions' => array('enctype' => 'multipart/form-data')
<?php echo $form->labelEx($model,'uploadedFile'); ?>
<?php echo $form->fileField($model,'uploadedFile'); ?>
<?php echo $form->error($model,'uploadedFile'); ?>
Nel controller:
$model->attributes=$_POST['InventarioPc'];
if($model->save()){
$model->descriz_html->saveAs( Yii::getPathOfAlias('backend.data.descrizpc') . DIRECTORY_SEPARATOR . $model->descriz_html_name);
$this->redirect(array('view','id'=>$model->id_postazione));
}
Il model
public $uploadedFile;
public function rules()
{
return array(
array('uploadedFile', 'file', 'types'=>'html, htm'),
);
}
public function beforeSave()
{
if($file=CUploadedFile::getInstance($this,'uploadedFile'))
{
$this->descriz_html_name = time() . "-" . $file->name;
$this->descriz_html = file_get_contents($file->tempName);
/*
$this->descriz_html_type=$file->type;
$this->descriz_html_size=$file->size;
*/
//$this->descriz_html=file_get_contents($file->tempName);
}
return parent::beforeSave();
}
L’errore:
CDbException
throw new CDbException(Yii::t('yii','CDbCommand failed to execute the SQL statement: {error}',
if($model->save())
st4nny
(St4nny)
July 19, 2013, 6:34pm
2
se commenti
// $this->descriz_html = file_get_contents($file->tempName);
va a buonfine?
prova con un codice di questo tipo, in sql statement con il bind dei parametri:
if($file=CUploadedFile::getInstance($this,'uploadedFile')){
$t = 'tbl_allegato';
//var
$file_name = $file->name;
$file_type = $file->type;
$file_size = $file->size;
$file_contents = file_get_contents($file->tempName);
// sql
$sql="INSERT INTO ".$t." (file_name,file_size,file_type,file_content)
VALUES(:file_name,:file_size,:file_type,:file_content)";
$connection = Yii::app()->db;
$command=$connection->createCommand($sql);
// bind params
$command->bindParam(":file_name",$file_name,PDO::PARAM_STR);
$command->bindParam(":file_type",$file_type,PDO::PARAM_STR);
$command->bindParam(":file_size",$file_size,PDO::PARAM_STR);
$command->bindParam(":file_content",$file_contents,PDO::PARAM_LOB);
$command->execute();
}
messema
(Emaxmex)
July 23, 2013, 9:07am
3
st4nny:
se commenti
// $this->descriz_html = file_get_contents($file->tempName);
va a buonfine?
prova con un codice di questo tipo, in sql statement con il bind dei parametri:
if($file=CUploadedFile::getInstance($this,'uploadedFile')){
$t = 'tbl_allegato';
//var
$file_name = $file->name;
$file_type = $file->type;
$file_size = $file->size;
$file_contents = file_get_contents($file->tempName);
// sql
$sql="INSERT INTO ".$t." (file_name,file_size,file_type,file_content)
VALUES(:file_name,:file_size,:file_type,:file_content)";
$connection = Yii::app()->db;
$command=$connection->createCommand($sql);
// bind params
$command->bindParam(":file_name",$file_name,PDO::PARAM_STR);
$command->bindParam(":file_type",$file_type,PDO::PARAM_STR);
$command->bindParam(":file_size",$file_size,PDO::PARAM_STR);
$command->bindParam(":file_content",$file_contents,PDO::PARAM_LOB);
$command->execute();
}
nemmeno cosi, però se tolgo il file binario riesce a registrarlo.
Ecco qui il pezzo di codice che mi va in errore
if($file=CUploadedFile::getInstance($model,'uploadedFile')){
$t = 'inventario_pc';
$file_contents = file_get_contents($file->tempName);
// sql
$sql="INSERT INTO ".$t." (cod_dip,nomecomputer, os, ram, disco, processore, licenza, ip_pc, descriz_html_name)
VALUES(:cod_dip, :nomecomputer, :os, :ram, :disco, :processore, :licenza, :ip_pc, :descriz_html_name)";
$connection = Yii::app()->db;
$command=$connection->createCommand($sql);
// bind params
$command->bindParam(":cod_dip",$model->cod_dip,PDO::PARAM_INT);
$command->bindParam(":nomecomputer",$model->nomecomputer,PDO::PARAM_STR);
$command->bindParam(":os",$model->os,PDO::PARAM_STR);
$command->bindParam(":ram",$model->ram,PDO::PARAM_STR);
$command->bindParam(":disco",$model->disco,PDO::PARAM_STR);
$command->bindParam(":processore",$model->processore,PDO::PARAM_STR);
$command->bindParam(":licenza",$model->licenza,PDO::PARAM_STR);
$command->bindParam(":ip_pc",$model->ip_pc,PDO::PARAM_STR);
$command->bindParam(":descriz_html_name",$model->descriz_html_name,PDO::PARAM_STR);
//$command->bindParam(":descriz_html",$file_contents,PDO::PARAM_LOB);
$command->execute();
$this->redirect(array('view','id'=>$model->id_postazione));
}
st4nny
(St4nny)
July 27, 2013, 7:58pm
4
prova a cambiare il tipo del campo nel db per il file binario.
messema
(Emaxmex)
August 5, 2013, 7:53am
5
[s]Mi sono accorto che i dati riesce a salvarli soltanto da localhost, se li inserisco da esterno (da web) mi registra tutto tranne l’html !!
Qualche impostazione da cambiare?[/s]
Era un problema di permessi, non riusciva a salvare il file nella cartella temp.
vot
(Votyger)
March 12, 2014, 5:57pm
6
Ciao a tutti,
riscontro la stessa eccezione ma purtroppo non credo sia un problema di permessi. Il mio obbiettivo è quello di salvare un file (immagine o altro) su db. In debug riesco a vedere il contenuto del file ed entrando nell’eccezione trovo questo messaggio:
An error occurred translating string for input param 2 to UCS-2: No mapping for the Unicode character exists in the target multi-byte code page.
Purtroppo anche googlando non sono riuscito a trovare nulla.
Qualcuno può darmi una mano?
Grazie!!