2016-02-11 2 views
0

Каков правильный способ передачи данных в ajax с помощью jquery. У меня есть следующий метод, и я хочу передать токен CSRF из метатега, но он не работает.Правильный способ передачи данных в JQuery Ajax

<meta name="csrf-token" content="{{ csrf_token() }}"> 
<div class="fallback"> 
     <input type="file" name="logo" id="logo" class="inputfile"/> 
</div> 


$(document).on("change", ".fallback .inputfile", function() { 
    $.ajax({ 
     url: "/upload", 
     type: 'POST', 
     cache: false, 
     data: { 
      _token: $('meta[name="csrf-token"]').attr('content') 
     }, 
     files: $(":file", this), 
     iframe: true, 
     processData: false 
    }).complete(function(data) { 
     console.log(data); 
     // $('#img-thumb').attr('src', data.path); 
     // $('input[name="job_logo"]').val(data.path); 
    }); 
}); 

метод Laravel для обработки файла:

public function upload(Request $request) { 


    if($request->hasFile('logo')) { 
     //upload an image to the /img/tmp directory and return the filepath. 
     $file = $request->file('logo'); 

     $tmpFileName = time() . '-' . $file->getClientOriginalName(); 

     $tmpFilePath = '/img/tmp/'; 

     $file = $file->move(public_path() . $tmpFilePath, $tmpFileName); 
     $path = $tmpFilePath . $tmpFileName; 
     return response()->json(['path'=> $path], 200); 
    } else { 
     return response()->json(false, 200); 
    } 
} 

Я следовал документации из следующего источника https://cmlenz.github.io/jquery-iframe-transport/

Я получаю tokenmismatch ошибку. Обратите внимание, это использование Laravel 5.1

* UPDATE *

Должно быть в состоянии добавить маркер непосредственно атрибутов данных, как маркер CSRF уже в моем мета-тег. Ниже приведен пример, сделанный с использованием backbone.js/ruby ​​на рельсах, но я не эксперт по магистрали/рельсам, поэтому, если кто-то может перевести это в jquery, это было бы полезно. (http://estebanpastorino.com/2013/09/27/simple-file-uploads-with-backbone-dot-js/)

uploadFile: function(event) { 
    var values = {}; 
    var csrf_param = $('meta[name=csrf-param]').attr('content'); 
    var csrf_token = $('meta[name=csrf-token]').attr('content'); 
    var values_with_csrf; 

    if(event){ event.preventDefault(); } 

    _.each(this.$('form').serializeArray(), function(input){ 
     values[ input.name ] = input.value; 
    }) 

    values_with_csrf = _.extend({}, values) 
    values_with_csrf[csrf_param] = csrf_token 

    this.model.save(values, { iframe: true, 
          files: this.$('form :file'), 
          data: values_with_csrf }); 
} 
+0

Что происходит, когда вы console.log ($ ('meta [name = "csrf-token"]'). Attr ('content'))? –

+0

Выдает ли _token ожидаемое значение? Как насчет файлов? – roland

+0

в панели проверки сети, действительно ли отправляется токен или jquery Перезаписывает его с данными из свойства файлов параметров ajax? –

ответ

1

Вы должны добавить к вашей странице:

$(function() { 

    $.ajaxSetup({ headers: { 'X-CSRF-TOKEN' : '{{ csrf_token() }}' } }); 

}); 

Это происходит потому, что AJAX нуждается в X-CSRF-TOKENкаждый раз вы посылаете запрос AJAX на сервер (если вы не включите его я не рекомендую).

ИСТОЧНИК: собственный опыт работы с Laravel.

+0

Смотрите мое обновление выше. – adam78

+0

@ozzii вы попробовали то, что я предложил? – Derek

+0

Я пробовал то, что вы сказали, и он оставляет сообщение, однако файл пуст - см. Мой метод laravel - он возвращает false каждый раз, что означает, что файл не отправляется. – adam78

2
processData: false 

Вы сказали JQuery в не преобразовать объект, содержащий данные в формат, пригодный для передачи по протоколу HTTP.

+0

Я следую документации 'https: // cmlenz.github.io/jquery-iframe-transport /' – adam78

Смежные вопросы