【问题标题】:MultipartFormData upload using Alamofire使用 Alamofire 上传 MultipartFormData
【发布时间】:2017-11-23 10:14:36
【问题描述】:

我一直在尝试使用 Alamofire 实现多部分表单数据。 我编写了一些代码,它适用于执行不到 60 秒的请求。但是,如果请求超出此范围,则会结束并且上传不会完成:

另外,我得到了这个输出(可能意味着我的应用正在尝试写入一个关闭的 tcp 套接字):

2017-06-20 17:22:21.924948 app[4645:1381848] [] nw_endpoint_flow_prepare_output_frames [110.1 10.39.80.102:8550 就绪套接字流(已满足)] 使用 1 帧失败,标记为失败

2017-06-20 17:22:21.928262 app[4645:1381848] [] nw_endpoint_handler_add_write_request [110.1 10.39.80.102:8550 失败的套接字流(已满足)] 无法接受写入请求

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

我已经尝试通过更改timeoutIntervalForRequesttimeoutIntervalForResource 参数来修改我用来执行请求的URLSessionConfiguration

func initManager(timeoutInterval:Double) {
    
    let configuration = URLSessionConfiguration.default
    
    configuration.timeoutIntervalForRequest = timeoutInterval
    configuration.timeoutIntervalForResource = timeoutInterval
    
    alamofireManager = Alamofire.SessionManager(configuration: configuration)
}

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

谢谢

【问题讨论】:

    标签: ios alamofire nsurlsession nsurlsessionconfiguration


    【解决方案1】:

    您可能会遇到服务器端的执行时间限制。也就是说,我认为 iOS 10.0 – 10.2.x 中还有一个错误可能导致这种不当行为。 (更多信息请访问https://forums.developer.apple.com/thread/67606。)

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

    我会建议以下替代方法:

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

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

    无论连接失败是因为 iOS 中的错误、服务器配置错误还是随机网络故障,这都可以避免丢失上传的单个字节。更好的是,它可能也适用于 NSURLSession 中的后台上传。

    【讨论】:

    • 谢谢@dgatwood。我完全忘记回答你了。你是对的,我在服务器端达到了执行时间限制(定义为 60 秒)。另外,您的建议非常好,我已经定义了一个任务来实现它(因为我使用的服务器支持正确执行它)。
    猜你喜欢
    • 2017-01-30
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多