我有一个rails 3.0.3网站,在开发模式下,通过调用didReceiveData然后调用connectionDidFinishLoading来响应HTTP GET,并将照片数据从网站发送到iPhone并正确显示。但是当我在Amazon Web Services上以生产模式运行rails 3.0.3网站时,在didReceiveData之前调用connectionDidFinishLoading。我正在使用carrierwave来处理开发和生产轨道站点的照片。
有没有人知道在didReceiveData之前是什么原因导致connectionDidFinishLoading被调用?
我试过检查以下内容:
1)我确保为类'interface。
调用NSURLConnectionDelegate2)didReceiveResponse在connectionDidFinishLoading和statusCode = 200之前没有被调用。
3)在rails应用程序中,我使用send_file发送照片数据,生成中发送的文件的路径是实际照片。
4)检查网站的完整请求显示,使用connectionDidFinishLoading中的以下代码从生产网站返回0字节的数据(原来这是didReceiveData未被调用的原因):
NSData *returnedData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://production_website"]];
以下是didReceiveData的代码:
// theConnectionData is an instance variable defined as:
NSMutableData *theConnectionData = [[NSMutableData data] retain];
-(void)connection:(NSURLConnection *)con didReceiveData: (NSData *)data {
[theConnectionData appendData:data ];
}
更新 - 我认为问题可能在轨道方面。以下是我用于将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生产网站的connectionDidFinishLoading之前没有调用didReceiveData?
答案 0 :(得分:0)
我终于明白了。在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"
根据这个post,看起来对于send_file的Rails 3有一些变化。这个post建议使用X-Accel-Redirect方法,但帖子声称请求是从rails应用程序发送的,而不是从nginx发送的。这个post声称nginx需要X-Accel-Redirect方法。