首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XMLHttpRequest - Laravel

XMLHttpRequest - Laravel
EN

Stack Overflow用户
提问于 2014-03-12 19:35:32
回答 1查看 9.1K关注 0票数 3

我正在用laravel上传一个文件,并使用ajax请求为其创建进度条。表单操作是这样路由到控制器的:

代码语言:javascript
运行
复制
<form action="{{ URL::route('upload-file-form-post') }}" method="POST" enctype="multipart/form-data">
.
.
</form>

ajax:

代码语言:javascript
运行
复制
function _(el) {
    return document.getElementById(el);
}

function uploadfile() {
  var file = _("file").files[0];
  // dev
  alert(file.name+" | "+file.size+ " | "+" | "+file.type);
  var formdata = new FormData();
  formdata.append("file", file);
  var ajax = new XMLHttpRequest();
  ajax.upload.addEventListener("progress", progressHandler, false);
  ajax.addEventListener("load", completeHandler, false);
  ajax.open("POST", "here_is_where_the_url_needs_to_go");
  ajax.send(formdata);
}

function progressHandler(event) {
   _("loaded_n_total").innerHTML = "Uploaded " + event.loaded + "bytes of "+ event.total;
   var percent = (event.loaded / event.total) * 100;
   _("progressBar").value = Math.round(percent);
   _("status").innerHTML = Math.round(percent)+"% uploaded... please wait";
}

function completeHandler(event) {
  _("status").innerHTML = event.target.responseText;
  _("progressBar").value = 0;
} 

有办法将这个{{ URL::route('upload-file-form-post') }}发送到ajax请求吗?

在我的路由文件中,上面的引用如下:

代码语言:javascript
运行
复制
Route::post('/asset/upload-file', array(
    'as'  => 'upload-file-form-post',
    'uses' => 'AssetController@postUploadCreate'
));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-12 20:31:10

只需使用JavaScript获取表单操作属性

代码语言:javascript
运行
复制
//Whatever your action value
var action = document.formName.getAttribute('action');

First:

不要在submit按钮上混合onclick事件,单击submit按钮实际上处理表单本身。最好将提交事件绑定到窗体,而不是绑定提交按钮上的单击事件。

通过向表单(如name )提供一个name="my_form"属性,您可以向表单中添加提交事件处理程序。

像这样的

代码语言:javascript
运行
复制
document.my_form.addEventListener('submit', function(e) {
    e.preventDefault();

    var actionURL = this.action; // will get the form action url
    uploadfile(actionURL); // your upload event with request url
});

函数uploadfile(..)将接受一个名为URL的参数。将传递给ajax.open(..)方法

改性:

代码语言:javascript
运行
复制
// -----------------!!!! pass parameter for url
function uploadfile(url) {
  var file = _("file").files[0];
  // dev
  alert(file.name+" | "+file.size+ " | "+" | "+file.type);
  var formdata = new FormData();
  formdata.append("file", file);
  var ajax = new XMLHttpRequest();
  ajax.upload.addEventListener("progress", progressHandler, false);
  ajax.addEventListener("load", completeHandler, false);
  ajax.open("POST", url); // your url will pass to open method
  ajax.send(formdata);
}

编辑:

修复Laravel不匹配令牌问题(参考)

在当前窗体视图文件的<meta >标记中添加下面的<head>标记。

代码语言:javascript
运行
复制
<meta name="csrf-token" content="<?php echo csrf_token() ?>">

或使用刀片

代码语言:javascript
运行
复制
<meta name="csrf-token" content="{{{ csrf_token() }}}">

现在,在您的uploadfile(...)函数中添加以下代码段:

代码语言:javascript
运行
复制
var metas = document.getElementsByTagName('meta'); 

for (i=0; i<metas.length; i++) { 
    if (metas[i].getAttribute("name") == "csrf-token") {  
        ajax.setRequestHeader("X-CSRF-Token", metas[i].getAttribute("content"));
    } 
}

请参阅此JavaScript中更新的小提琴代码。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22362032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档