如何使用Ajax在Kartik输入文件中发送所选文件?

时间:2017-03-02 21:30:21

标签: php jquery ajax yii2 kartik-v

我想用drag&在我的Yii2应用程序中使用Kartik输入文件删除上传文件。 他们说这个"拖动&降"输入文件模型需要 AJAX 才能发送数据。 我只关注here的Kartik输入文件的主代码和here的AJAX。我是编程新手,我还不知道如何使用AJAX。

所以我尝试在我的 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(); ?>

输入文件在视图中成功显示,但是当我点击提交按钮时,它并没有发送我选择的文件。 我想在我的 studentsController 中处理数据(path = app / controllers / studentsController。

我不确定如何设置上面的行代码,我已将其标记为&#39;服务器上传操作&#39;。

也许有人可以告诉我我的代码行是否错误,

如何通过ajax发送选择的文件?

Anyhelp将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:0)

这是解决方案

查看文件:

 <?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");
                 }',



            ],
        ]);
        ?>

控制器文件:

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

    }
?>

我将上传功能添加到附件模型。

<?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;
}
..
?>

答案 1 :(得分:0)

使用Kartik FileInput小部件保存多个图像文件

Yii2 Kartik FileInput在上载温度和上载图像之前输入多个图像显示和删除和更新新图像。

我想在我的Yii2应用程序中使用Kartik输入文件来使用可下载的拖放文件。他们说,这种输入拖放文件模型需要AJAX发送数据。我只是从这里遵循Kartik输入文件的主要代码,从这里遵循AJAX。我是编程新手,但是我仍然不知道如何使用AJAX。

因此,我试图在Form.php(路径= app /modules/products/views/Form.php)中结合这两个代码:

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

Table : product
id (Primary)
Name
ect

此处查看表单...

<?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);
?>

此处控制器文件:

<?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();
                    }
                }
            }

     }


    ?>

这里是模型场。 我在附件模型中添加了加载功能。

<?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;
    }

?>