【问题标题】:Yii2: Kartik InputFile show "Single File Upload Failed" error message in progress barYii2:Kartik InputFile 在进度条中显示“单个文件上传失败”错误消息
【发布时间】:2017-03-16 01:21:02
【问题描述】:

我有一个使用 Yii2 基本框架的应用程序,我正在使用 Kartik InputFile 上传文件。文件成功上传到系统,页面也成功跳转到下一页,但是在跳转到下一页前几秒,显示进度条这样的错误

为什么这个小部件显示通知“上传失败”虽然文件已成功上传?

这是我的代码在 _form.php

<?php $form = ActiveForm::begin(); ?>
<?php
echo FileInput::widget([
    'name' => 'file_uploads',
    'language' => 'id',
    'options' => [
        'accept' => 'doc/*', 'file/*',
        'multiple' => true,
        'enableLabel' => true,
    ],
    'pluginOptions' => [
        'allowedFileExtensions' => ['xls', 'xlsx'],
        'uploadUrl' => Url::to(['/pib/pib-data/create']),
        'maxFileSize' => 1024,
        'maxFileCount' => 1,
        'showCaption' => false,
        'showMessage'=>false,
        'purifyHtml'=>false
    ]
]);
?>
<?php ActiveForm::end(); ?>

这是我在控制器中使用的代码:

<?php
public function actionCreate() {
    $model = new PibData();
    $connection = \Yii::$app->db;
    $userId = Yii::$app->user->id;
    if (Yii::$app->user->isGuest) {
        return $this->redirect(['/site/login']);
    }

    $sqlHeader = "UPDATE pib_data SET is_exported = '1' WHERE user_id = '$userId'";
    $exeQuery = Yii::$app->db->createCommand($sqlHeader)->execute();
    $date = new DateTime('now', new \DateTimeZone('Asia/Jakarta'));
    $created_at = $date->format('Y:m:d H:i:s');
    $dirTrash = Yii::getAlias('@webroot/trash');
    $dirSubTrash = Yii::getAlias('@webroot/trash/trash_pib');

    if (!is_dir($dirTrash)) {
        mkdir(Yii::getAlias('@webroot/trash'));
        if (!is_dir($dirSubTrash)) {
            mkdir(Yii::getAlias('@webroot/trash/trash_pib'));
        }
    } else {
        if (!is_dir($dirSubTrash)) {
            mkdir(Yii::getAlias('@webroot/trash/trash_pib'));
        }
    }

    if (Yii::$app->request->post()) {
        $file = UploadedFile::getInstancesByName('file_uploads');
        $middleName = substr(md5(microtime() * 100000), rand(0, 9), 5);
        if ($file !== null) {
            $name = $userId . '_' . $middleName . '_' . date('Y-m-d') . '_' . $file[0]->getBaseName() . "." . $file[0]->getExtension();
            $pathproduct = Yii::getAlias('@webroot/trash/trash_pib/') . $name;
            $file[0]->saveAs($pathproduct);
        Yii::$app->response->format = Response::FORMAT_JSON;
        return [];
        } else {
            $error[] = "Silahkan pilih terlebih dahulu file" . "<strong>" . " Excel " . "</strong>" . "yang akan di convert.";
            Yii::$app->session->setFlash('error', $error);
            return $this->render('create', ['model' => $model]);
        }

        $modelUser = Users::find()->where(['id' => $userId])->one();
        $parentId = $modelUser->parent_id;

        $objPHPExcel = new \PHPExcel();
        $fileName = Yii::getAlias('@webroot/trash/trash_pib/') . $name;
        $inputFiles = fopen(Yii::getAlias('@webroot/trash/trash_pib/') . $name, "r");
        try {
            $inputFileType = \PHPExcel_IOFactory::identify($fileName);
            $objReader = \PHPExcel_IOFactory::createReader($inputFileType);
            $objPHPExcel = $objReader->load($fileName);
        } catch (Exception $ex) {
            die('Error');
        }

        $sheet = $objPHPExcel->getSheet(0);
        $highestRow = $sheet->getHighestDataRow();
        $highestColumn = $sheet->getHighestDataColumn();
        $colNumber = PHPExcel_Cell::columnIndexFromString($highestColumn);
        $col = $colNumber - 1;
        $arrayData = [];
        
        for ($row = 1; $row <= $highestRow; ++$row) {
            $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
            $arrayData[] = array_map(function($values) {
                $tempArray = [];
                foreach ($values as $key => $value) {
                    $newKey = $key + 1;
                    $tempArray[] = $newKey . '_' . $value;
                }
                return $tempArray;
            }, $rowData);
        }

        $arrayHeader = array_shift($arrayData);
        $countArrayData = count($arrayData);
        $countArrayHeader = count($arrayHeader[0]);

        for ($i = 0; $i < $countArrayData; $i++) {
            for ($j = 0; $j < $countArrayHeader; $j++) {
                if ($j < 9) {
                    $finalData[$i][] = substr($arrayData[$i][0][$j], 2);
                } else {
                    $finalData[$i][] = substr($arrayData[$i][0][$j], 3);
                }
            }
        }

        for ($x = 0; $x < $countArrayData; $x++) {
            array_unshift($finalData[$x], "dummy");
        }

        $tempData = mysql_escape_string(json_encode($finalData));
        $tempHeader = json_encode($arrayHeader);
        $header = base64_encode($tempHeader);

        $command_1 = "DELETE FROM pib_json_data WHERE user_id= '$userId'";
        $query_1 = Yii::$app->db->createCommand($command_1)->execute();
        $command_2 = "INSERT INTO pib_json_data(json_data, user_id, created_at) VALUES('$tempData', '$userId', '$created_at')";
        $query_2 = Yii::$app->db->createCommand($command_2)->execute();

        $_SESSION['header'] = $header;
        $_SESSION['validHeader'] = 'validHeader';

        return Yii::$app->response->redirect(['/pib/pib-header/select-header']);
    } else {
        return $this->render('create', [
                    'model' => $model,
        ]);
    }
}
?>

我们将不胜感激。

谢谢

【问题讨论】:

    标签: php yii2 kartik-v


    【解决方案1】:

    嗯...根据documentation,在“重要”部分:

    您必须从您的服务器发送一个有效的 JSON 响应,否则上传 过程将失败。即使您没有遇到任何错误,您也必须在 至少从您的服务器发送一个空的 JSON 对象 {}。

    所以,我相信你的代码应该是这样的。

    控制器:

    <?php
    public function actionCreate() {
        $model = new PibData();
        $connection = \Yii::$app->db;
        $userId = Yii::$app->user->id;
        if (Yii::$app->user->isGuest) {
            return $this->redirect(['/site/login']);
        }
    
        $sqlHeader = "UPDATE pib_data SET is_exported = '1' WHERE user_id = '$userId'";
        $exeQuery = Yii::$app->db->createCommand($sqlHeader)->execute();
        $date = new DateTime('now', new \DateTimeZone('Asia/Jakarta'));
        $created_at = $date->format('Y:m:d H:i:s');
        $dirTrash = Yii::getAlias('@webroot/trash');
        $dirSubTrash = Yii::getAlias('@webroot/trash/trash_pib');
    
        if (!is_dir($dirTrash)) {
            mkdir(Yii::getAlias('@webroot/trash'));
            if (!is_dir($dirSubTrash)) {
                mkdir(Yii::getAlias('@webroot/trash/trash_pib'));
            }
        } else {
            if (!is_dir($dirSubTrash)) {
                mkdir(Yii::getAlias('@webroot/trash/trash_pib'));
            }
        }
    
        if (Yii::$app->request->post()) {
            Yii::$app->response->format = Response::FORMAT_JSON;
            $result = [];
            $file = UploadedFile::getInstancesByName('file_uploads');
            $middleName = substr(md5(microtime() * 100000), rand(0, 9), 5);
            if ($file !== null) {
                $name = $userId . '_' . $middleName . '_' . date('Y-m-d') . '_' . $file[0]->getBaseName() . "." . $file[0]->getExtension();
                $pathproduct = Yii::getAlias('@webroot/trash/trash_pib/') . $name;
                $file[0]->saveAs($pathproduct);
            } else {
                $error[] = "Silahkan pilih terlebih dahulu file" . "<strong>" . " Excel " . "</strong>" . "yang akan di convert.";
                //Yii::$app->session->setFlash('error', $error);
                //return $this->render('create', ['model' => $model]);
                $result = [
                    'error' => $error
                ]; // change error notification used Kartik FileInput build-in error message 
            }
    
            $modelUser = Users::find()->where(['id' => $userId])->one();
            $parentId = $modelUser->parent_id;
    
            $objPHPExcel = new \PHPExcel();
            $fileName = Yii::getAlias('@webroot/trash/trash_pib/') . $name;
            $inputFiles = fopen(Yii::getAlias('@webroot/trash/trash_pib/') . $name, "r");
            try {
                $inputFileType = \PHPExcel_IOFactory::identify($fileName);
                $objReader = \PHPExcel_IOFactory::createReader($inputFileType);
                $objPHPExcel = $objReader->load($fileName);
            } catch (Exception $ex) {
                //die('Error');
                $result = [
                    'error' => $ex
                ]; // change error notification used Kartik FileInput build-in error message 
            }
    
            $sheet = $objPHPExcel->getSheet(0);
            $highestRow = $sheet->getHighestDataRow();
            $highestColumn = $sheet->getHighestDataColumn();
            $colNumber = PHPExcel_Cell::columnIndexFromString($highestColumn);
            $col = $colNumber - 1;
            $arrayData = [];
    
            for ($row = 1; $row <= $highestRow; ++$row) {
                $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
                $arrayData[] = array_map(function($values) {
                    $tempArray = [];
                    foreach ($values as $key => $value) {
                        $newKey = $key + 1;
                        $tempArray[] = $newKey . '_' . $value;
                    }
                    return $tempArray;
                }, $rowData);
            }
    
            $arrayHeader = array_shift($arrayData);
            $countArrayData = count($arrayData);
            $countArrayHeader = count($arrayHeader[0]);
    
            for ($i = 0; $i < $countArrayData; $i++) {
                for ($j = 0; $j < $countArrayHeader; $j++) {
                    if ($j < 9) {
                        $finalData[$i][] = substr($arrayData[$i][0][$j], 2);
                    } else {
                        $finalData[$i][] = substr($arrayData[$i][0][$j], 3);
                    }
                }
            }
    
            for ($x = 0; $x < $countArrayData; $x++) {
                array_unshift($finalData[$x], "dummy");
            }
    
            $tempData = mysql_escape_string(json_encode($finalData));
            $tempHeader = json_encode($arrayHeader);
            $header = base64_encode($tempHeader);
    
            $command_1 = "DELETE FROM pib_json_data WHERE user_id= '$userId'";
            $query_1 = Yii::$app->db->createCommand($command_1)->execute();
            $command_2 = "INSERT INTO pib_json_data(json_data, user_id, created_at) VALUES('$tempData', '$userId', '$created_at')";
            $query_2 = Yii::$app->db->createCommand($command_2)->execute();
    
            $_SESSION['header'] = $header;
            $_SESSION['validHeader'] = 'validHeader';
    
            //return Yii::$app->response->redirect(['/pib/pib-header/select-header']);
            $result = [
                'url' => Url::to(['/pib/pib-header/select-header'])
            ]; // return url variable to be used by jquery
            return $result;
        } else {
            return $this->render('create', [
                        'model' => $model,
            ]);
        }
    }
    ?>
    

    查看:

    <?php
    
    use yii\web\View;
    ...
    
    <?php $form = ActiveForm::begin(); ?>
    <?php
    echo FileInput::widget([
        'name' => 'file_uploads',
        'language' => 'id',
        'options' => [
            'accept' => 'doc/*', 'file/*',
            'multiple' => true,
            'enableLabel' => true,
        ],
        'pluginOptions' => [
            'allowedFileExtensions' => ['xls', 'xlsx'],
            'uploadUrl' => Url::to(['/pib/pib-data/create']),
            'maxFileSize' => 1024,
            'maxFileCount' => 1,
            'showCaption' => false,
            'showMessage'=>false,
            'purifyHtml'=>false
        ]
    ]);
    ?>
    <?php ActiveForm::end(); ?>
    
    <?php
    $this->registerJS("
        $('#input-id').on('fileuploaded', function(event, data, previewId, index) { // replace input-id with your file input id
            var response = data.response;
            $(location).attr('href', response.url); // redirect use jquery
        });", View::POS_END);
    

    希望对你有所帮助。

    愉快的编码。 :)

    【讨论】:

    • 是的,你是对的,我错过了我:D 我已经尝试了你的代码,它可以工作,它不会给出错误消息,但它不会重定向到下一页。其实应该继续//another code。希望你能帮忙:) 谢谢
    • 嗯...如果你能告诉我什么是“另一个代码”,也许我可以帮忙。 :)
    • 我已经添加了完整的操作代码 :) 看看。谢谢:)
    • 我认为您应该使用 javascript(或 jquery)处理视图中的重定向。更新了我的答案。希望它有所帮助。 :)
    • Halo :D 我试过你的代码,但是 javascript 没有用。它重定向到下一页,但它没有给出响应,所以它仍然显示错误,我可以知道在哪里可以找到输入文件的 id 吗?谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2011-03-10
    • 2019-03-21
    • 1970-01-01
    相关资源
    最近更新 更多