Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone ConnectiondDiFinishLoading在didReceiveData之前调用,rails生产发送照片_Iphone_Ruby On Rails 3_Amazon Web Services_Nsurlconnection_Carrierwave - Fatal编程技术网

Iphone ConnectiondDiFinishLoading在didReceiveData之前调用,rails生产发送照片

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

我有一个rails 3.0.3网站,在开发模式下,它通过调用didReceiveData和ConnectiondFinishLoading响应HTTP GET,照片数据从网站发送到iPhone并正确显示。但当我在Amazon Web服务上以生产模式运行rails 3.0.3网站时,ConnectiondFinishLoading在didReceiveData之前被调用。我正在使用carrierwave处理rails开发和生产站点的照片

有人知道什么会导致ConnectiondFinishLoading在收到数据之前被调用吗

我已尝试检查以下内容:

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吗?