хранение изображения на сервере из модального ввода не работает - PullRequest
0 голосов
/ 17 октября 2018

Я храню некоторые данные из модального ввода.Все работает нормально, но когда я работаю с данными типа файла, в этом случае я беру изображение, которое должно быть сохранено в папке сервера, а его местоположение должно быть сохранено в базе данных.

  1. Я проверяю, хочет ли пользователь добавить данные
  2. , затем отправляет данные в соответствующий метод контроллера через ajax
  3. , сохраняю изображение в выбранной папке ивосстановить местоположение изображения, а затем отправить все данные в модель, чтобы сохранить их в базе данных.Код:

модальный:

<div class="modal fade" id="modal_form" role="dialog">
<div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h3 class="modal-title">Blog Form</h3>
        </div>
        <div class="modal-body form">
            <form id="form" class="form-horizontal" method='post' action='' enctype="multipart/form-data>
                <input type="hidden" value="" name="id"/>
                <div class="form-body">
                    <div class="form-group">
                        <label class="control-label col-md-3">Author Name</label>
                        <div class="col-md-9">
                            <input name="author" placeholder="author" class="form-control" type="text">
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="control-label col-md-3">Blog Title</label>
                        <div class="col-md-9">
                            <input name="title" placeholder="title" class="form-control" type="text">
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="control-label col-md-3">Blog Category</label>
                        <div class="col-md-9">
                            <input name="tag" placeholder="tag" class="form-control" type="text">

                        </div>
                    </div>
                    <div class="form-group">
                        <label class="control-label col-md-3">Blog Details</label>
                        <div class="col-md-9">
                            <input name="details" placeholder="details" class="form-control" type="text">

                        </div>
                    </div>
                    <div class="form-group">
                        <label class="control-label col-md-3">Blog Picture</label>
                        <div class="col-md-9">
                            <input name="picture" id="picture" placeholder="Add a photo" type="file">

                        </div>
                    </div>
                </div>
            </form>
        </div>
        <div class="modal-footer">
            <button type="button" id="btnSave" onclick="save()" class="btn btn-primary">Save</button>
            <button type="button" class="btn btn-danger" data-dismiss="modal">Cancel</button>
        </div>
    </div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->

Функция сохранения в сценарии:

function save()
{
    var url;
    if(save_method == 'add')
    {
        url = "<?php echo site_url('index.php/admin/blog_add')?>";
    }
    else
    {
        url = "<?php echo site_url('index.php/admin/blog_update')?>";
    }
    $.ajax({
        url : url,
        type: "POST",
        data: $('#form').serialize(),
        dataType: "JSON",
        success: function(data)
        {
            //if success close modal and reload ajax table
            $('#modal_form').modal('hide');
            location.reload();// for reload a page
        },
        error: function (jqXHR, textStatus, errorThrown)
        {
            alert('Error adding / update data');
        }
    });
}

Метод Blog_add в административном контроллере:

public function blog_add(){
$picture_name = $this->store_photo_return_photo_location();
$data = array(
    'author' => $this->input->post('author'),
    'title' => $this->input->post('title'),
    'details' => $this->input->post('details'),
    'tag' => $this->input->post('tag'),
    'picture' => $picture_name,
);
$insert = $this->admin_model->blog_add($data);
echo json_encode(array("status" => TRUE));}

Функция store_photo_return_photo_location:

public function store_photo_return_photo_location(){
    $filename = $_FILES['picture']['name'];
    // Location
    $location = 'assets/images/'.$filename;
    // file extension
    $file_extension = pathinfo($location, PATHINFO_EXTENSION);
    $file_extension = strtolower($file_extension);
    // Valid image extensions
    $image_ext = array("jpg","png","jpeg","gif");
    $response = 0;
    if(in_array($file_extension,$image_ext)){
        // Upload file
        if(move_uploaded_file($_FILES['picture']['tmp_name'],$location)){
            $response = $location;
        }
    }
    return $response;}

модель:

public function blog_add($data)
{
    $this->db->insert($this->table, $data);
    return $this->db->insert_id();
}

Пока я не работал с данными без изображения, он работал нормально, но когда я работаю сизображение, это не так.

Я думаю, что проталкивание имени изображения через ajax не работает.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Функция javascript serialize() не сможет получить файл из HTML-формы.Вы должны использовать FormData() вместо

data: new FormData($('#form')),

Также в вашей функции store_photo_return_photo_location() убедитесь, что файл действительно существует, прежде чем продолжить загрузку

if(!empty($_FILES['picture']['name'])){
   //proceed
}
0 голосов
/ 17 октября 2018

Существует другой подход к загрузке файла через ajax.Пожалуйста, отметьте это: https://stackoverflow.com/a/2320097/10412708

Более простой подход состоит в том, чтобы поместить URL отправки в действие вашей формы и позволить форме отправить и обновить страницу.В любом случае, ваш JS перезагружает страницу в случае успеха, почему вы даже использовали ajax для?Попытайтесь предварительно подготовить URL для отправки в PHP, если это возможно.

0 голосов
/ 17 октября 2018

Вы вызываете эту функцию для загрузки изображения, но не для передачи данных 'post' этой функции

$this->store_photo_return_photo_location();

, называете это так

$image = $this->input->post['picture'];
$this->store_photo_return_photo_location($image);

и изменяете свою функцию

public function store_photo_return_photo_location($image) {
  //..your code
}
...