目前,我的iOS应用程序创建了一个文件(为简单起见,假设它是一个文本文件)。我希望能够通过HTTP POST请求将其发送到我的Rails应用程序。
目前,我将文件转换为NSData,创建一个请求(NSMutableURLRequest),其中url为POST路由。然后我使用NSURLConnection.sendAsynchronousRequest尝试发送文件。
对于我的Rails方面,我创建了一个带有按钮的主路由,该按钮上传文件并通过POST路由提交。这在本地工作(即如果我从我的计算机上传文件,它会通过)。
但是,我收到503错误,这意味着由于服务器临时过载或维护,Web服务器(运行Web站点)当前无法处理HTTP请求。
这是否意味着: 一个。我对发件人的实现不正确 湾我对接收器的实现是不正确的 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的内存太少而无法满足我的需求。
答案 0 :(得分:2)
如发现,问题是由于内存限制。
我建议使用直接上传到S3 - 这样该文件就会绕过您的服务器。
您可以使用Carrierwave Direct gem。阅读解决方案的文档 - 这非常简单。您需要在此处添加您在网络表单参数中看到的查询参数
%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设置的好帖子:How to get More Bang for your Heroku Buck While Making Your Rails Site Super Snappy [Redux]。