使用Alamofire上传MultipartFormData

时间:2017-06-20 18:15:17

标签: ios alamofire nsurlsession nsurlsessionconfiguration

我一直在尝试使用Alamofire实现多部分表单数据。 我制作了一些代码,它适用于60秒以下的请求。但是,如果请求超过该请求,则结束并且上载未完成:

Variables view

另外,我收到此输出(可能意味着我的应用程序正在尝试写入已关闭的tcp套接字):

  

2017-06-20 17:22:21.924948 app [4645:1381848] [] nw_endpoint_flow_prepare_output_frames [110.1 10.39.80.102:8550 ready socket-flow(satisf)]无法使用1帧,标记为失败

     

2017-06-20 17:22:21.928262 app [4645:1381848] [] nw_endpoint_handler_add_write_request [110.1 10.39.80.102:8550 socket-flow(满意)失败]无法接受写请求

     

2017-06-20 17:22:21.929278 app [4645:1381027] [] __tcp_connection_write_eof_block_invoke写入关闭回调收到错误:[22]无效参数

我已尝试通过更改URLSessionConfigurationtimeoutIntervalForRequest参数来修改我用于执行请求的timeoutIntervalForResource

func initManager(timeoutInterval:Double) {

    let configuration = URLSessionConfiguration.default

    configuration.timeoutIntervalForRequest = timeoutInterval
    configuration.timeoutIntervalForResource = timeoutInterval

    alamofireManager = Alamofire.SessionManager(configuration: configuration)
}

但是,我仍然遇到同样的问题。有谁知道如何解决这个问题?或者有人面临同样的问题吗?

由于

1 个答案:

答案 0 :(得分:1)

您可能正在服务器端达到执行时间限制。也就是说,我认为iOS 10.0 - 10.2.x中的一个错误也可能导致这种不当行为。 (更多https://forums.developer.apple.com/thread/67606。)

即使您解决了这个特定问题的原因,但这里的根本问题是设计问题,而不是请求问题本身。网络不可靠,蜂窝网络也是如此。保持蜂窝连接超过一分钟的几率与赢得彩票的几率大致相同。 (是的,这很夸张,但你明白了。)

我建议采用以下替代方法:

  • POST或PUT端点,它接受文件名,数据流和写入字节的可选偏移量。
  • 一个单独的POST端点,用于处理使用上述端点上载的文件。
  • 一个单独的GET端点,它返回指定上传文件的当前大小。

然后,在客户端,您开始上传。如果由于任何原因导致上载失败,则在文件大小端点上发出GET,并发出一个新POST,其偏移量设置为文件长度之后的第一个字节(并且仅提供上载数据的最后一部分) ,显然)。

这可以避免因为iOS中的错误,服务器配置错误或者随机网络故障导致连接失败而丢失上传的单个字节。更好的是,它也可能在NSURLSession的后台上传中可以接受。