将txt文件从iOS设备发送到Rails应用程序

将txt文件从iOS设备发送到Rails应用程序,ios,ruby-on-rails,Ios,Ruby On Rails,目前,我的iOS应用程序创建了一个文件(为了简单起见,假设它是一个文本文件)。我希望能够通过HTTP POST请求将其发送到我的Rails应用程序 目前,我将该文件转换为NSData,创建一个请求(NSMutableURLRequest),其中url指向POST路由。然后,我使用NSURLConnection.sendAsynchronousRequest尝试通过网络发送文件 在Rails方面,我创建了一个带有按钮的主路由,该按钮上载文件并通过POST路由提交。这在本地起作用(如果我从电脑上传文

目前,我的iOS应用程序创建了一个文件(为了简单起见,假设它是一个文本文件)。我希望能够通过HTTP POST请求将其发送到我的Rails应用程序

目前,我将该文件转换为NSData,创建一个请求(NSMutableURLRequest),其中url指向POST路由。然后,我使用NSURLConnection.sendAsynchronousRequest尝试通过网络发送文件

在Rails方面,我创建了一个带有按钮的主路由,该按钮上载文件并通过POST路由提交。这在本地起作用(如果我从电脑上传文件,它就会通过)

但是,我返回了一个503错误,这意味着由于服务器临时过载或维护,Web服务器(运行Web站点)当前无法处理HTTP请求

这是否意味着: A.我对发件人的实现不正确 B我对接收器的实现不正确 C可能是出了什么问题

更新

按照评论中的说明,我的日志如下:

Process running mem=1222M(238.7%)
2015-08-04T19:44:04.014099+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)
2015-08-04T19:44:12.737956+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/update" host=serverforperfomance.herokuapp.com request_id=0d24dfb1-4366-416c-b7c4-57c48659a275 fwd="66.211.109.190" dyno=web.1 connect=2ms service=44140ms status=503 bytes=0

我仍然想知道我的实现是否正确,或者只是heroku的内存太少,无法完成我需要它做的事情。

正如所发现的,问题是由于内存限制

我建议直接上传到S3,这样文件就可以绕过服务器

你可以用gem。阅读解决方案的文档–非常简单。您将需要添加查询参数,您在此处将其视为web表单参数

%form{:action => @uploader.direct_fog_url, :method => "post", :enctype => "multipart/form-data"}
  %input{:name => "utf8", :type => "hidden"}
  %input{:type => "hidden", :name => "key", :value => @uploader.key}
  %input{:type => "hidden", :name => "AWSAccessKeyId", :value => @uploader.aws_access_key_id}
  %input{:type => "hidden", :name => "acl", :value => @uploader.acl}
  %input{:type => "hidden", :name => "success_action_redirect", :value => @uploader.success_action_redirect}
  %input{:type => "hidden", :name => "policy", :value => @uploader.policy}
  %input{:type => "hidden", :name => "signature", :value => @uploader.signature}
  %input{:name => "file", :type => "file"}
  %input{:type => "submit", :value => "Upload to S3"}
作为iOS代码中的请求参数

大文件上传往往会占用大量CPU/内存资源,因此最好的选择是不使用Heroku(即,按照我的建议使用直接到S3上传,或者使用单独的非Heroku服务器来处理上传和/或后处理),因为任何额外资源对您来说都相当有限/昂贵


UPD。关于优化Heroku设置的好文章:。

您应该从您的
log/production.log
(如果您在生产环境中运行Rails服务器)或
log/development.log
中为我们提供相关行。只需在您的服务器上写入terminal
tail-f log/production.log
,然后从您的iOS设备启动请求,然后复制粘贴您看到的行。哦,很有趣。运行mem=1222M(238.7%)的进程2015-08-04T19:44:04.014099+00:00 heroku[web.1]:错误R14(超过内存配额)2015-08-04T19:44:12.737956+00:00 heroku[router]:at=Error code=H12 desc=“请求超时”方法=POST path=“/update”主机=serverforperformance.herokuapp.com请求id=0d24dfb1-4366-416c-b7c4-57c48659a275 fwd=“66.211.109.190”dyno=web.1 connect=2ms服务=44140ms状态=503字节=0正常,那么。。。我发送的文件太大了吗?还是传输文件的行为占用了太多内存?有没有一种方法可以在不花费更多内存的情况下做到这一点?用您发现的信息更新您的问题。我将写下我的建议作为答案。贝格上传的文件大小是多少?我发送了100Mb。虽然当我把它降到100b时,我得到了422个错误。这可能是因为我还没有真正完成上传…嗯,但我确实希望我自己的站点能够访问该文件(比如在站点上显示文本文件的内容)。直接到S3是否会导致传输时间比发送到我的服务器慢?直接到S3很可能会更快(S3服务器没有刻意设置的CPU/宽带/等限制),但这取决于网络条件(用户与服务器和S3之间的路径)。使用有限的Heroku帐户上传文件确实是一件痛苦的事情。还添加了关于优化Heroku服务器的帖子链接。但是,一般来说,如果你没有资源,你就没有资源。我个人会考虑搬到一些VPS(数字海洋,切片主机等),这将更便宜,虽然将需要一些工作来设置。哦,那就好了。但我的网站将无法访问上述文件,但必须将其从S3中拉出来?或者换句话说,没有更好的解决方案了?是的,我的意见是没有更好的解决方案了。您可以从S3中提取该文件,但很有可能,您的web dyno会尝试这样做(与从客户端获取该文件没有区别)。最好的方案是以一种允许用户自己从S3中提取文件并在适当位置渲染的方式设计应用程序。