我正在向将请求参数写入文件的 php 文件发出一些连续(递归)ajax 请求:
make_ajax(s)
{
var xhr = new XMLHttpRequest();
xhr.onreadystatechange=function()
{
if(this.readyState == 4 && this.status == 200)
{
if(s>0)
make_ajax(s-1)
}
};
xhr.open('POST','write.php?s='+s+'&string=somelongstring',true);//url + async/sync
...
xhr.send(null);
}
make_ajax(15);//start request
写.php:
file_put_contents('test.txt',$_GET['s']);
似乎服务器在关闭 text.txt 文件之前返回到 ajax 请求,因此递归发送的下一个 ajax 请求会收到拒绝访问错误,因为似乎文件是否仍由 previrios ajax 请求打开(事件已返回)?我什至使用 async=false 测试了这个脚本,但我得到了同样的错误?如何避免 php 脚本在关闭文件之前返回?
注意:我没有使用 session ,我只是将数据发送到服务器以保存在文件中。
NOTE2:这里我做了一个简单的例子,实际上我是使用这种方法通过ajax和mozSlice方法分块上传文件。完整代码:
function uploadFileXhr(o,start_byte)
{
var total=o.size;
var chunk;
var peice=1024 * 1024;//bytes to upload at once
var end_byte=start_byte+peice;
var peice_count=end_byte/peice;
$('#debug').html(peice_count);
var is_last=(total-end_byte<=0)?1:0;
chunk=o.mozSlice(start_byte, end_byte);
var xhr = new XMLHttpRequest();//prepare xhr for upload
xhr.onreadystatechange=function()
{
if(this.readyState == 4 && this.status == 200)
{
if(is_last==0)
{
uploadFileXhr(o,end_byte);
}
}
};
xhr.open('POST','upload.php',true);//url + async/sync
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');//header
xhr.setRequestHeader('Content-Type', 'multipart/form-data');//type for upload
xhr.send(chunk);//send request of file
}
uploadFileXhr(file_input,0);//start recrusive call
上传.php:
$flag =($_GET['start']==0) ? 0:FILE_APPEND;
file_put_contents($remotePath.$add.$file_name, file_get_contents('php://input'),$flag);
注意 3:OK 实际上在 upload.php 脚本中找到了避免该错误的解决方法:
$flag =($_GET['start']==0) ? 0:FILE_APPEND;
$file_part=file_get_contents('php://input');
while(@file_put_contents($remotePath.$add.$file_name, $file_part,$flag)===FALSE)
{
usleep(50);
}
但我仍然无法解释为什么在第一种情况下会出现访问被拒绝的错误,所以等待评论!
最佳答案
目标文件(test.txt)中是否出现任何内容? IE。它是在发出第一个请求后 失败还是立即失败?该错误表明服务器无法写入文件。这可能是因为某些其他进程正在使用该文件,或者因为 Web 服务器没有对该文件的写入权限。只是为了消除显而易见的问题,请确保您的网络服务器实际上被允许写入该文件。
关于php - file_put_contents 访问在多个 AJAX 请求上被拒绝(但已同步)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7781372/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle