Iphone ConnectiondDiFinishLoading在didReceiveData之前调用,rails生产发送照片
我有一个rails 3.0.3网站,在开发模式下,它通过调用didReceiveData和ConnectiondFinishLoading响应HTTP GET,照片数据从网站发送到iPhone并正确显示。但当我在Amazon Web服务上以生产模式运行rails 3.0.3网站时,ConnectiondFinishLoading在didReceiveData之前被调用。我正在使用carrierwave处理rails开发和生产站点的照片 有人知道什么会导致ConnectiondFinishLoading在收到数据之前被调用吗 我已尝试检查以下内容:Iphone ConnectiondDiFinishLoading在didReceiveData之前调用,rails生产发送照片,iphone,ruby-on-rails-3,amazon-web-services,nsurlconnection,carrierwave,Iphone,Ruby On Rails 3,Amazon Web Services,Nsurlconnection,Carrierwave,我有一个rails 3.0.3网站,在开发模式下,它通过调用didReceiveData和ConnectiondFinishLoading响应HTTP GET,照片数据从网站发送到iPhone并正确显示。但当我在Amazon Web服务上以生产模式运行rails 3.0.3网站时,ConnectiondFinishLoading在didReceiveData之前被调用。我正在使用carrierwave处理rails开发和生产站点的照片 有人知道什么会导致ConnectiondFinishLoad
config.action_dispatch.x_sendfile_header = "X-Accel-Redirect"
1) 我确保为类的接口调用了NSURLConnectionLegate
2) 在ConnectiondFinishLoading和statusCode=200之前,不会调用didReceiveResponse
3) 在rails应用程序中,我使用send_file发送照片数据,而在生产中发送的文件的路径是实际照片
4) 通过检查对网站的完整请求,发现使用ConnectiondFinishLoading中的以下代码从生产网站返回了0字节的数据(这就是没有调用didReceiveData的原因):
以下是didReceiveData的代码:
// theConnectionData is an instance variable defined as:
NSMutableData *theConnectionData = [[NSMutableData data] retain];
-(void)connection:(NSURLConnection *)con didReceiveData: (NSData *)data {
[theConnectionData appendData:data ];
}
更新-我认为问题可能出在rails方面。下面是我用来将rails应用程序中的照片从AWS上的本地存储发送到iPhone应用程序的代码:
@p = Photo.find_by_user_id(user_id)
uploader = @p.avatar
uploader.retrieve_from_store!(File.basename(@p.avatar.url))
uploader.cache_stored_file!
send_file(uploader.file.path,
:disposition => 'inline',
:encoding => 'binary',
:type => @p.content_type,
:stream => false,
:filename => URI.encode(@p.filename),
:x_sendfile => true,
:buffer_size => 16384
)
有人知道为什么在rails生产网站的ConnectiondFinishLoading之前没有调用didReceiveData吗?我终于找到了答案。在config/environments/production.rb中注释掉以下内容修复了该问题:
# config.action_dispatch.x_sendfile_header = "X-Sendfile"
通过将config/environments/production.rb中的上述行替换为以下内容,也解决了该问题:
config.action_dispatch.x_sendfile_header = "X-Accel-Redirect"
根据这一点,看起来Rails3对send_文件做了一些更改。这建议使用X-Accel-Redirect方法,但post声称请求随后是从rails应用程序而不是从nginx发送的。这表明nginx需要X-Accel-Redirect方法。它应该可以工作。。但是我们无法测试您的代码。如果您可以提供didReceiveData的代码。请注意,didReceiveData会被rails的开发版本调用,但不会被rails的生产版本调用。您能否提供生产网站地址,以便我可以测试…这可能是您的网站(而不是iphone)在生产中编码的问题模式,
didReceiveData
是否在connectiondFinishLoading
之后调用?实际上,服务器没有调用任何东西,是您的NSURLConnection将其状态通知其委托。你是不是一次只拿一张照片?可能控制台中有几个NSURLConnection日志重叠。是的,我一次只取一张照片。这是一个有趣的想法,请求可能是重叠的。但如果是,如何调用ConnectiondDiFinishLoading而从不调用didReceiveData?在其中一张照片的ConnectiondFinishLoading之前不会调用ReceiveData吗?