我目前正在设计一个系统,用于将多个图像从应用程序上传到服务器。这些文件将存储在本地设备上,目前的想法是将它们分成 block ,然后将它们逐 block 上传到服务器,等待返回成功消息再上传下一个。
这个过程对用户来说应该是无缝的,他们应该按下一个按钮来提交所有图像,然后能够关闭应用程序并让它在后台继续。在 iOS 7 中,我看到您可以将上传内容传递给新的 NSURLSession API,并让它独立于您的应用程序处理上传任务。
我想知道是否有人知道此传输的可靠性。如果我将整个图像传递给它,如果互联网连接在中途断开会怎样?后台传输服务是否稍后重试?我们的想法是,我们可以上传一张图片,如果中途失败,我们可以在连接恢复后从那一点继续。
我们的一个想法是将文件分成 block ,然后将所有 block 作为单独的 NSURLSessionUploadTasks 传递,并假设它们最终都会被发送到服务器。
另一个是发送第一个 block 使用:
uploadTaskWithRequest:fromData:completionHandler:
然后在 completitionHandler 中发送下一个 block 。我的问题是,如果在后台,下一个 block 将有它的
@property BOOL discretionary = true
这意味着它只会在插入时通过 WiFi 发送。我需要它在所有网络上工作并能够应对中断。
我不需要任何代码,只是建议这是否是实现此目标的正确方法。
最佳答案
我会尽量回答你的一些问题
如果您的上传因错误而中途停止,您的应用应该会在后台启动,您应该能够执行所需的错误处理。在您的情况下,如果您的服务器支持可恢复上传,您应该能够获得偏移量,然后设置另一个任务来上传下一个 block 。
如果您使用配置为在后台运行的 NSURLSession,那么您不能使用完成处理程序设置上传任务,并且您不能使用 NSData 对象上传您的 block 。您唯一的选择是将 block 写入磁盘,然后使用
uploadTaskWithRequest:fromFile:
我认为这是有道理的,因为 NSData 对象驻留在应用程序内存中,后台上传由外部守护程序执行,因此只有上传文件(从用户的沙箱)是正确的。此外,除了使用完成处理程序之外,您还需要使用委托(delegate)来监听回调(当应用程序位于前台时)。
如果您仍然喜欢使用 NSData 对象,那么另一种解决方案是使用
创建一个任务downloadTaskWithRequest:
通过这种方式,您可以在请求正文中设置 NSData 对象并将其传递到请求中。您将需要使用 NSURLMutableRequest 设置您的请求以实现此目的。
对于自由裁量权属性,由于它默认为 TRUE,我不确定我们是否可以为此做很多事情。它说传输更有可能发生在 Wi-Fi 和插入时,因此它可能通过蜂窝网络发生的可能性很小,但不要相信我的话,我只是猜测。
关于iOS 7 - NSURLSession 可恢复上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19113889/
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同
我在尝试使用Faraday将文件上传到网络服务时遇到问题。我的代码:conn=Faraday.new('http://myapi')do|f|f.request:multipartendpayload={:file=>Faraday::UploadIO.new('...','image/jpeg')}conn.post('/',payload)尝试发布后似乎没有任何反应。当我检查响应时this是我所看到的:#:post,:body=>#,#,@opts={}>,#],@index=0>>,#>],@ios=[#,#,@opts={}>,#],@index=0>,#],@index=0>