Hi everyone,
When I upload zip file contains .db file, I have a issue: Database is saved but zip file is not save by path.
My view:
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?> <?= $form->field($model, 'name')->input('text')->label('Name') ?>
<?= $form->field($model, 'uploadFile')->fileInput([ 'required'=>'required'])->label('Choose file') ?>
<?= $form->field($model, 'description')->textarea() ?>
<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
<?= Html::a('Back', ['/input-file'], ['class'=>'btn btn-danger']) ?>
</div>
<?php ActiveForm::end(); ?>
My Controller
public function actionCreate()
{
$username = Yii::$app->user->identity->username;
$model = new UploadInputFile();
if ($model->load(Yii::$app->request->post())) {
$model->uploadFile = UploadedFile::getInstance($model, 'uploadFile');
date_default_timezone_set("Asia/Ho_Chi_Minh");
$datetime = date('Y-m-d H:i:s');
$suffixx = date('YmdHis', time());
if(empty($model->uploadFile->name)){
$model->addError('uploadFile', 'you have to choce a file !');
return $this->render('create', compact('model'));
}
if(strpos($model->uploadFile->name,'.zip')){
$file_name = substr($model->uploadFile->name, 0, strpos($model->uploadFile->name, '.zip')).$username;
} else{
$file_name = substr($model->uploadFile->name, 0, strpos($model->uploadFile->name, '.xls')).$username;
$model->uploadFile->name = $file_name;
}
if ($model->upload()) {
// insert to db
$modelInputFile = new InputFile();
$modelInputFile->name = $model->name;
$modelInputFile->description = $model->description;
$modelInputFile->value = $model->json;
$modelInputFile->file_name = $file_name;
$modelInputFile->created_at = $datetime;
$modelInputFile->updated_at = $datetime;
$modelInputFile->user_id = Yii::$app->user->getId();
if ($modelInputFile->save()) {
return $this->redirect('index');
}
//check file_name
if( $model->uploadFile->name === $modelInputFile->file_name ){
$model->addError('uploadFile', 'Please change another name !');
return $this->render('create', compact('model'));
}
}
else{
$model->addError('uploadFile', 'Please change another name !');
return $this->render('create', compact('model'));
}
}
return $this->render('create', compact('model'));
}
My Model
public function rules()
{
return [
[['name'], 'required'],
[['description'], 'safe'],
[['uploadFile'], 'file', 'extensions' => 'xls, xlsx, zip, db', 'skipOnEmpty' => false],
];
}
public function upload($update = 'false')
{
$username = Yii::$app->user->identity->username;
$uploadFileName = $this->uploadFile->name;
if($update == 'true'){
$uploadFileName = $uploadFileName.'.zip';
}
if(strpos($uploadFileName,'.zip')){
$arr = scandir(Yii::$app->basePath.'/uploads/input/');
$file_name = substr($uploadFileName, 0, strpos($uploadFileName, '.zip'));
if(strpos($file_name,$username)){
$file_name = substr($file_name,0,strpos($file_name,$username));
}
$filePath = Yii::$app->basePath.'/uploads/input/'.$file_name.$username.".zip";
foreach ($arr as $key => $value) {
if ($value != "." && $value != "..") {
if($value == $file_name.$username){
return false;
}
else{
continue;
}
}
}
$this->uploadFile->saveAs($filePath);
$zip = new \ZipArchive();
$res = $zip->open($filePath);
if ($res === TRUE) {
// Extract file
$zip->extractTo(Yii::$app->basePath.'/uploads/input/');
$zip->close();
rename(Yii::$app->basePath.'/uploads/input/'.$file_name,Yii::$app->basePath.'/uploads/input/'.$file_name.$username);
$path = Yii::$app->basePath.'/uploads/input/'.$file_name.$username."/".$file_name.$username;
rename(Yii::$app->basePath.'/uploads/input/'.$file_name.$username."/".$file_name.".xlsx",$path);
$this->json = Yii::$app->converter->readFile($path);
}
return true;
}
else{
$filePath = Yii::$app->basePath.'/uploads/input/'.$this->uploadFile->name;
$arr = scandir(Yii::$app->basePath.'/uploads/input/');
foreach ($arr as $key => $value) {
if ($value != "." && $value != "..") {
if($value == $this->uploadFile->name){
return false;
}
else{
continue;
}
}
}
$this->uploadFile->saveAs( $filePath);
$this->json = Yii::$app->converter->readFile($filePath);
return true;
}
}
This is my mistake or yii2’s mistake or any update?
Thanks everyone!