How to use send the chosen file in Kartik Input File using Ajax?

扶醉桌前 提交于 2019-12-13 12:41:40

问题


I want to use drag & drop upload file using Kartik Input File in my Yii2 application. They said this "drag & drop" input file model need AJAX for send the data. I just following the main code for Kartik Input File from here, and the AJAX from here. I'm new in programming, and I dont know yet how to use AJAX.

So I've tried to combine both of code like this in my view.php(path = app/views/students/view.php):

<script>
$(".btn-success").fileinput({
    uploadUrl: 'students/create',  // server upload action
    uploadAsync: true,
    maxFileCount: 1
});
</script>
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>
<?php echo '<label class="control-label">Choose an Excel file(.xlsx, .xls)</label>'; ?>
<?php
echo FileInput::widget([
    'model' => $model,
    'name' => 'attachment_48[]',
    'options' => [
        'accept' => 'doc/*', 'file/*',
        'enableLabel' => TRUE,
    ],
    'pluginOptions' => [
        'allowedFileExtensions' => ['xls', 'xlsx'],
        'showUpload' => TRUE,
        'showPreview' => TRUE,
        'maxFileSize' => 1024, //limit for choosen file
        'browseLabel' => 'Browse (Max 1MB)',
        'uploadUrl' => Url::to(['students/create']), // server upload action
        'maxFileCount' => 1
    ]
]);
?>

<?php echo '<br>' ?>
<?= Html::submitButton('<i class="glyphicon glyphicon-save-file"></i> UPLOAD FILE', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary'], ['students/create']) ?>
<?php ActiveForm::end(); ?>

The input file successfully showed in view, but when I clicked submit button, it doesn't send the file that I've choose. I want to process the data in my studentsController(path = app/controllers/studentsController.

I'm not sure how to set the line code above that I've marked as 'server upload action'.

Maybe anyone can tell me if my line of codes is wrong, and

How do I can send the choosen file through the ajax?

Anyhelp will be appreciated.

Thanks.


回答1:


This is the solution

View file:

 <?php
        echo FileInput::widget([
            'name' => 'files[]',
            'options' => ['multiple' => true, 'id' => 'unique-id-1'],
            'pluginOptions' => ['allowedFileExtensions' => ['jpg', 'gif', 'png', 'doc', 'docx', 'pdf', 'xlsx', 'rar', 'zip', 'xlsx', 'xls', 'txt', 'csv', 'rtf', 'one', 'pptx', 'ppsx', 'pot'],
                'previewFileType' => 'any', 'showUpload' => false, 'showRemove' => false, 'initialPreviewAsData' => true, 'overwriteInitial' => true,
                "uploadUrl" => Url::to(['site/upload']),
                'msgUploadBegin' => Yii::t('app', 'Please wait, system is uploading the files'),
                'msgUploadThreshold' => Yii::t('app', 'Please wait, system is uploading the files'),
                'msgUploadEnd' => Yii::t('app', 'Done'),
                'dropZoneClickTitle'=>'',
                "uploadAsync" => false,
                "browseOnZoneClick"=>true,
                'fileActionSettings' => [
                    'showZoom' => true,
                    'showRemove' => true,
                    'showUpload' => false,
                ],
                'maxFileCount' => 20, 'maxFileSize' => 10000, 'msgPlaceholder' => Yii::t('story', 'Select attachments'),
            ],
            'pluginEvents' => [
                'filebatchselected' => 'function() {
                 $(this).fileinput("upload");
                 }',



            ],
        ]);
        ?>

Controller file:

<?php
public function actionUpload()
    {
        if (isset($_POST)) {
            $files= Attachments::SaveTempAttachments($_FILES);
            $result = ['files'=>$files];
            Yii::$app->response->format = trim(Response::FORMAT_JSON);
            return $result;
        }

    }
?>

I added the uploading function to Attachments model.

<?php
...
 public static function SaveTempAttachments($attachments)
{
    $files="";
    $allwoedFiles=['jpg', 'gif', 'png', 'doc', 'docx', 'pdf', 'xlsx', 'rar', 'zip', 'xlsx', 'xls', 'txt', 'csv', 'rtf', 'one', 'pptx', 'ppsx', 'pot'];

    if (!empty($attachments)) {
        if (count($attachments['files']['name']) > 0) {
            //Loop through each file
            for ($i = 0; $i < count($attachments['files']['name']); $i++) {
                //Get the temp file path
                $tmpFilePath = $attachments['files']['tmp_name'][$i];

                //Make sure we have a filepath
                if ($tmpFilePath != "") {
                    //save the filename
                    $shortname = $attachments['files']['name'][$i];
                    $size = $attachments['files']['size'][$i];
                    $ext = substr(strrchr($shortname, '.'), 1);
                    if(in_array($ext,$allwoedFiles)){
                        //save the url and the file
                        $newFileName = Yii::$app->security->generateRandomString(40) . "." . $ext;
                        //Upload the file into the temp dir
                        if (move_uploaded_file($tmpFilePath, Helper::UPLOAD_FOLDER . '/' . Helper::TEMP_FOLDER . '/' . $newFileName)) {
                            $files[] =['fileName'=>$newFileName,'type'=>$ext,'size'=>(($size/1000)),'originalName'=>$shortname];
                        }

                    }
                }
            }
        }

    }
    return $files;
}
..
?>



回答2:


Save Multiple Image Files Using Kartik FileInput Widget

Yii2 Kartik FileInput Multiple Images Before Upload Temp and Uploaded Images Display and Delete and Update new images.

I want to use a downloadable drag and drop file using the Kartik Input File in my Yii2 application. They said that this input drag & drop file model requires AJAX to send data. I just follow the main code for the Kartik input file from here and AJAX from here . I am new to programming, and I still do not know how to use AJAX.

Therefore, I tried to combine both codes, like this, in my Form.php (path = app /modules/products/views/Form.php):

Table : products_images
id (Primary)
product_id  (FK)
image

Table : product
id (Primary)
Name
ect

Here View Forms...

<?php
use yii\helpers\Html;
use yii\helpers\Url;
use kartik\widgets\FileInput;
?>

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>

<?php echo '<label class="control-label">Choose an Image file(.png, .jpg)</label>'; ?>

<?php
//For Update Form : Fetch Uploaded Images and create Array to preview
$imagesList = array();
$imagesListId = array();
foreach ($model->productsImages as $img) {
    $imagesList[] = Url::base(TRUE) . '/' . $img->image;
    $imagesListId[]['key'] = $img->id;
}
?>

<?php
    $empty_image = Url::base(TRUE) . "/uploads/image-upload-empty.png";

    echo FileInput::widget([
        'model' => $model,
        'attribute' => 'products_image[]',
        'name' => 'products_image[]',
        'options' => ['multiple' => true, 'accept' => 'image/*', 'id' => 'products_image_id'],
        'pluginOptions' => [
            'initialPreview' => $imagesList,
            'initialPreviewConfig' => $imagesListId,
            'deleteUrl' => Url::to(['products/delete-image']),
            'showCaption' => false,
            'showRemove' => false,
            'showUpload' => false,
            'browseClass' => 'btn btn-primary col-lg-6 col-md-8 col-sm-8 col-xs-6',
            'browseIcon' => '<i class="glyphicon glyphicon-plus-sign"></i> ',
            'browseLabel' => 'Upload Image',
            'allowedFileExtensions' => ['jpg', 'png'],
            'previewFileType' => ['jpg', 'png'],
            'initialPreviewAsData' => true,
            'overwriteInitial' => false,
            "uploadUrl" => Url::to(['products/upload']),
            'uploadExtraData' => ['products_id' => $model->id, 'is_post' => $model->isNewRecord ? 'new' : 'update'],
            'msgUploadBegin' => Yii::t('app', 'Please wait, system is uploading the files'),
            //'msgUploadThreshold' => Yii::t('app', 'Please wait, system is uploading the files'),
            //'msgUploadEnd' => Yii::t('app', 'Done'),
            'msgFilesTooMany' => 'Maximum 15 products Images are allowed to be uploaded.',
            'dropZoneClickTitle' => '',
            "uploadAsync" => true,
            "browseOnZoneClick" => true,
            "dropZoneTitle" => '<img src=' . $empty_image . ' />',
            'fileActionSettings' => [
                'showZoom' => true,
                'showRemove' => true,
                'showUpload' => false,
            ],
            'validateInitialCount' => true,
            'maxFileCount' => 15,
            'maxFileSize' => 5120, //5mb
            'msgPlaceholder' => 'Select attachments',
        ],
        'pluginEvents' => [
            'filebatchselected' => 'function(event, files) {
              $(this).fileinput("upload");

              }',
            /* 'uploadExtraData' => 'function() {
              var out = {}, key, i = 0;
              $(".kv-input:visible").each(function() {
              $el = $(this);
              key = $el.hasClass("kv-new") ? "new_" + i : "init_" + i;
              out[key] = $el.val();
              i++;
              });

              return out;
              }', */
            'filepredelete' => 'function(event, files) {
                //var abort = true;
                var index = uploaded_images.indexOf(files);
                if (index !== -1) uploaded_images.splice(index, 1);
                 console.log(uploaded_images);
                 $("#productsmaster-images_array").val(uploaded_images);
               //return abort;   
            }',
            'fileuploaded' => 'function(event, data, previewId, index){
               //alert( data.response.initialPreviewConfig[0].key);
          uploaded_images.push(data.response.initialPreviewConfig[0].key);
            console.log(uploaded_images);
            $("#productsmaster-images_array").val(uploaded_images);
          }',
        /* 'filepreupload' => 'function(event, data, previewId, index){
          var form = data.form, files = data.files, extra = data.extra,
          response = data.response, reader = data.reader;
          console.log(data.jqXHR);
          console.log("File pre upload triggered");
          }', */
        ],
    ]);
    ?>

<?= $form->field($model, 'images_array')->hiddenInput()->label(false) ?>

<?php echo '<br>' ?>
<?= Html::submitButton('<i class="glyphicon glyphicon-save-file"></i> UPLOAD FILE', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary'], ['students/create']) ?>
<?php ActiveForm::end(); ?>

<?php
$script = <<< JS
   // initialize array    
   var uploaded_images = [];  
JS;
$this->registerJs($script);
?>

Here Controller file:

<?php

/*
     * Post products Images Upload Action Via FileInput Yii2 Extention.
     */

    public function actionUpload() {
        $files = array();
        $allwoedFiles = ['jpg', 'png'];
        if ($_POST['is_post'] == 'update') {
            $products_id = $_POST['products_id'];
            if ($_FILES) {
                $tmpname = $_FILES['ProductsMaster']['tmp_name']['products_image'][0];
                $fname = $_FILES['ProductsMaster']['name']['products_image'][0];
                //Get the temp file path
                $tmpFilePath = $tmpname;
                //Make sure we have a filepath
                if ($tmpFilePath != "") {
                    //save the filename
                    $shortname = $fname;
                    $size = $_FILES['ProductsMaster']['size']['products_image'][0];
                    $ext = substr(strrchr($shortname, '.'), 1);
                    if (in_array($ext, $allwoedFiles)) {
                        //save the url and the file
                        $newFileName = Yii::$app->security->generateRandomString(40) . "." . $ext;
                        //Upload the file into the temp dir
                        if (move_uploaded_file($tmpFilePath, 'uploads/products/' . $newFileName)) {
                            $productsImages = new productsImages();
                            $productsImages->products_id = $products_id;
                            $productsImages->image_for = 'products';
                            $productsImages->image = 'uploads/products/' . $newFileName;
                            $productsImages->created_at = time();
                            $productsImages->save();
                            $files['initialPreview'] = Url::base(TRUE) . '/uploads/products/' . $newFileName;
                            $files['initialPreviewAsData'] = true;
                            $files['initialPreviewConfig'][]['key'] = $productsImages->id;
                            return json_encode($files);
                        }
                    }
                }
            } /* else {
              return json_encode(['error' => 'No files found for pload.']);
              } */
            return json_encode($files);
        } else {
            if (isset($_POST)) {
                if ($_FILES) {
                    $files = ProductsMaster::SaveTempAttachments($_FILES);
                    return json_encode($files);
                    $result = ['files' => $files];
                    Yii::$app->response->format = trim(Response::FORMAT_JSON);
                    return $result;
                } /* else {
                  echo json_encode(['error' => 'No files found for pload.']);
                  } */
            }
        }
    }


    /**
     * Uploaded Images Delete Action on Update Forms Action
     * @return boolean
     */
    public function actionDeleteImage() {
        $key = $_POST['key'];
        if (is_numeric($key)) {
            $products_image = ProductsImages::find()->where(['id' => $key])->one();
            unlink(Yii::getAlias('@webroot') . '/' . $products_image->image);
            $products_image->delete();
            return true;
        } else {
            unlink(Yii::getAlias('@webroot') . '/uploads/products/temp/' . $key);
            return true;
        }
    }

    /**
    ** Create Products
    **/
     public function actionCreate() {

          //Products Images
        // temp store image moved and save to database.. with generated forms.. 
            if (count($model->images_array) > 0) {
                $images_array = explode(',', $model->images_array);
                if (!empty($images_array) && $model->images_array != '') {
                    foreach ($images_array as $image) {
                        $file = Yii::$app->basePath . '/uploads/products/temp/' . $image;
                        $rename_file = Yii::$app->basePath . '/uploads/products/' . $image;
                        rename($file, $rename_file);
                        $productsImages = new productsImages();
                        $productsImages->products_id = $model->id;
                        $productsImages->image_for = 'products';
                        $productsImages->image = 'uploads/products/' . $image;
                        $productsImages->created_at = time();
                        $productsImages->save();
                    }
                }
            }

     }


    ?>

Here Model Fiel. I added a load function to the attachment model.

<?php 

/*
     * Save Temp Images 
     */

    public static function SaveTempAttachments($attachments) {
        $files = "";
        $allwoedFiles = ['jpg', 'png'];
        if ($_FILES) {
            $tmpname = $_FILES['ProductsMaster']['tmp_name']['products_image'];
            $fname = $_FILES['ProductsMaster']['name']['products_image'];

            if (!empty($attachments)) {
                if (count($fname) > 0) {
                    //Loop through each file
                    for ($i = 0; $i < count($fname); $i++) {
                        //Get the temp file path
                        $tmpFilePath = $tmpname[$i];
                        //Make sure we have a filepath
                        if ($tmpFilePath != "") {
                            //save the filename
                            $shortname = $fname[$i];
                            $size = $attachments['ProductsMaster']['size']['products_image'][$i];
                            $ext = substr(strrchr($shortname, '.'), 1);
                            if (in_array($ext, $allwoedFiles)) {
                                //save the url and the file
                                $newFileName = Yii::$app->security->generateRandomString(40) . "." . $ext;
                                //Upload the file into the temp dir
                                if (move_uploaded_file($tmpFilePath, 'uploads/products/temp/' . $newFileName)) {
                                    $files['initialPreview'] = Url::base(TRUE) . '/uploads/products/temp/' . $newFileName;
                                    $files['initialPreviewAsData'] = true;
                                    // $files['uploadExtraData'][]['is_post'] = 'new';
                                    $files['initialPreviewConfig'][]['key'] = $newFileName;
                                }
                            }
                        }
                    }
                }
            }
        }
        return $files;
    }

?>


来源:https://stackoverflow.com/questions/42566347/how-to-use-send-the-chosen-file-in-kartik-input-file-using-ajax

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!