标签: nsurlsessionuploadtask

如何在没有完成块的NSURLSession中获取服务器响应数据

NSURLSession用于背景图片上传.根据上传的图像,我的服务器给了我回复,我相应地更改了我的应用程序.但是当我的应用程序在后台上传图片时,我无法获得服务器响应,因为没有完成块.

有没有办法在不使用完成块的情况下获得响应NSURLUploadTask

这是我的代码:

 self.uploadTask = [self.session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            NSString *returnString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"returnString : %@",returnString);
            NSLog(@"error : %@",error);
        }];
 [self.uploadTask resume];
Run Code Online (Sandbox Code Playgroud)

但我得到了这个错误..

由于未捕获的异常'NSGenericException'而终止应用程序,原因:'后台会话不支持完成处理程序块.请改为使用委托.

但是,如果我不能使用完成处理程序,我应该如何获得服务器响应.它说使用委托,但我找不到任何可以给我服务器响应的委托方法.

ios nsurlsession nsurlsessionuploadtask

46
推荐指数
1
解决办法
3万
查看次数

无法使用iOS中的NSURLSession多部分表单数据上传文件

我正在尝试- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL; 使用多部分表单数据的方法上传视频/图像文件.但不知何故,我无法上传文件,我收到" stream ended unexpectedly"错误.

要求

  1. 将视频/图像文件上传到服务器
  2. 应用程序应支持后台上传(即使在应用程序进入后台后仍继续上传过程)
  3. 服务器期望使用多部分表单数据发送数据.

方法/ API用于实现此目的

  1. NSURLSession后台会话API(下面列出的完整代码)

    2.- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL

面临的挑战/问题

  1. stream ended unexpectedly每次我使用此API进行上传过程时都会出现" "错误

需要注意的要点

  1. 上传越来越成功的相同的代码,如果我用NSURLConnection的不是NSURLSession.

  2. NSURLSession后台上传进程期望文件location(NSURL)作为参数,不接受NSData.它不允许我们NSData在上传之前将文件转换为,即我们无法将NSData添加到文件体.

需要以下几点的帮助

  1. 在正在形成的multipart formdata主体中是否有任何错误(注意 - 相同的代码与NSURLConnection一起使用)

  2. 我的方法在哪里出错?

  3. 我们是否需要在服务器级别进行任何更改以支持NSURLSession backgroundSession上传?(在数据解析或其他什么?)

    以下是用于上载文件的代码

NSString*BoundaryConstant = @"---------- V2ymHFg03ehbqgZCaKO6jy";

    // string constant for the post parameter 'file'. My server uses this name: `file`. Your's may differ
    NSString* FileParamConstant = @"file"; …
Run Code Online (Sandbox Code Playgroud)

file-upload multipartform-data nsurlsession nsurlsessionconfiguration nsurlsessionuploadtask

14
推荐指数
2
解决办法
6478
查看次数

NSURLSessionUploadTask如何读取服务器响应

我正在使用NSURLSessionUploadTask上传文件.

以下是我的代码的一些部分不完整

let session:NSURLSession = NSURLSession(configuration: config, delegate: self, delegateQueue: NSOperationQueue .mainQueue())

let sessionTask:NSURLSessionUploadTask = session.uploadTaskWithStreamedRequest(request
Run Code Online (Sandbox Code Playgroud)

但问题是我无法获得服务器发回的JSON响应.

以下代表也没有解雇,但其他代表正在解雇

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData)
Run Code Online (Sandbox Code Playgroud)

我正在使用的代码:

func sendFileToServer1(fileName:String,fileData:NSData,serverURL:String){

let body = NSMutableData()

let mimetype = "application/octet-stream"
//        let mimetype = "video/quicktime"

let boundary = "Boundary-\(NSUUID().UUIDString)"
let url = NSURL(string: serverURL)

let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"
request.setValue("multipart/form-data; boundary=----\(boundary)", forHTTPHeaderField: "Content-Type")
body.appendData("------\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Disposition:form-data; name=\"file\"; filename=\"\(fileName)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Type: \(mimetype)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(fileData)
body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("------\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Disposition:form-data; name=\"submit\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Submit\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("------\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
request.HTTPBody=body

let …
Run Code Online (Sandbox Code Playgroud)

server-response json ios nsurlsession nsurlsessionuploadtask

13
推荐指数
1
解决办法
857
查看次数

使用NSURLSession UploadTask暂停,恢复,取消上传任务

我正在开发一个使用NSURLSession上传多个文件的应用程序,现在我的文件已成功上传.但现在我想要实现的是暂停,恢复和取消上传,就像我们在下载任务中一样.可能吗.?任何帮助,将不胜感激.日Thnx

objective-c ios ios7 nsurlsession nsurlsessionuploadtask

8
推荐指数
1
解决办法
6879
查看次数

NSURLSession后台传输无法正常工作

我正在尝试从服务器下载一系列文件到iOS应用程序,目的是即使应用程序处于后台模式也会发生这些文件的下载.

我正在使用NSURLSession及其一系列API 提供的后台传输.

当应用程序在前台模式下运行时,我启动了下载任务,它给了我预期的结果,因为一系列的下载工作正常,但如果我在下载系列正在进行时按下主页按钮,那么它会立即停止,当我进入应用程序时再次下载将恢复.

如果用简单的话说出来,背景转移甚至不能让我工作.

编辑

最初我在模拟器中对它进行了测试它不能很好地工作,有人评论说在真实设备中测试相同,所以我通过在调试模式下连接真实设备进行测试它确实运行良好我觉得一切都解决但又给了我震惊,如果我从Xcode断开设备并检查应用程序,它根本不起作用:(

我创建了一个示例应用程序来演示此问题,请从此处下载

注意:在此示例应用程序中,我重新启动了didFinishDownloadingToURL中的下载调用以模拟一系列下载文件

你能帮助我解决这个问题吗?

ios nsurlsession nsurlsessionconfiguration nsurlsessiondownloadtask nsurlsessionuploadtask

7
推荐指数
1
解决办法
553
查看次数

URLSessionUploadTask立即自动取消

我有这个奇怪的问题,其中新创建的内容URLSessionUploadTask立即被取消.我不确定它是否是目前Xcode 8测试版的一个错误.

我怀疑这可能是一个错误,因为我即将发布的代码只运行一次.之后没有对它进行任何更改,然后它就停止了工作.是的,它实际上只运行一次,然后停止工作.我会在最后发布错误.

我将在下面发布代码,但首先我将总结这里的逻辑是如何工作的.

我的测试或用户公开的API(用于Playgrounds或直接在应用程序中使用的IE)调用该authorize方法.此authorize方法将依次调用buildPOSTTask,该方法将构造有效的URL并返回URLSessionUploadTaskauthorize方法使用的URL .

话虽如此,代码如下:

会议:

internal let urlSession = URLSession(configuration: .default)
Run Code Online (Sandbox Code Playgroud)

创建上传任务的功能:

internal func buildPOSTTask(onURLSession urlSession: URLSession, appendingPath path: String, withPostParameters postParams: [String : String]?, getParameters getParams: [String : String]?, httpHeaders: [String : String]?, completionHandler completion: URLSessionUploadTaskCompletionHandler) -> URLSessionUploadTask {
    let fullURL: URL
    if let gets = getParams {
        fullURL = buildURL(appendingPath: path, withGetParameters: gets)
    } else {
        fullURL = URL(string: path, relativeTo: baseURL)!
    } …
Run Code Online (Sandbox Code Playgroud)

ios nsurlsession nsurlsessionuploadtask swift3 xcode8

6
推荐指数
1
解决办法
1万
查看次数

AFNetworking V 2是否支持非流式多部分后台上传任务?

我正在处理的项目需要上传视频.用于上传视频的后API调用需要多部分正文.我试图使用的代码包含在问题的底部.

该代码非常适合[NSURLSessionConfiguration defaultSessionConfiguration].

如果我将配置更改为[NSURLSessionConfiguration backgroundSessionConfiguration:@"Test Id"],则代码崩溃,因为后台会话仅支持文件上载.错误是:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Upload tasks in background sessions must be from a file'

可以在以下方法中使用的所有多部分追加方法都使用AFMultipartBodyStream类.此类流式传输上传,因此它不能在后台会话中使用,因为流不是文件.

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer]
                         multipartFormRequestWithMethod:@"POST"
                         parameters:params
                         constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
                             NSError *error = nil;
                             [formData appendPartWithFileURL:fileURL
                                                        name:@"uploadFile"
                                                    fileName:[fileURL lastPathComponent]
                                                    mimeType:@"video/quicktime"
                                                       error:&error];
                         } error:&error];
Run Code Online (Sandbox Code Playgroud)

是否可以使用可以在使用backgroundSessionConfiguration的AFHTTPSessionManager中运行的多部分主体的NSURLSessionUploadTask?

请参阅以下示例代码:

NSURL *APIURL = [NSURL URLWithString:@"https://www.test.com/uploadVideo"];

NSError *error = nil;

NSDictionary *params = @{ @"token" : @"d5bcf6c2-99ec-4de7-bd87-71918b633b3a",
                          @"title" : @"Test_Video" };

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] …
Run Code Online (Sandbox Code Playgroud)

multipartform-data ios afnetworking-2 nsurlsessionuploadtask

5
推荐指数
1
解决办法
870
查看次数

NSURLSession后台上传大文件

我试图在后台上传一个2GB的大文件NSURLSessionUploadTask.该服务使用多部分格式,所以为了在后台上传我正在创建一个带有请求主体的临时文件,然后我使用uploadTask来安排上传,当文件完成上传时我正在删除临时文件.

NSURLSessionUploadTask *uploadTask = [[self backgroundNSURLSession] uploadTaskWithRequest:uploadRequest fromFile:filePath]; [uploadTask resume];

对于小于1.4 GB的文件,上传工作正常,但是当我尝试上传2 GB的视频文件时,上传失败.服务器返回错误消息,我没有附加文件.

我正在将ASIHTTP的上传组件重构为NSURLSession,如果我使用ASIHTTP进行上传,它甚至可以用于大文件.

这是我创建我的NSURLSession的方式:

 if ([NSURLSessionConfiguration respondsToSelector:@selector(backgroundSessionConfigurationWithIdentifier:)]) {
        self.configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:appID];
    } else  {
        self.configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:appID];
    }
    self.configuration.HTTPMaximumConnectionsPerHost = 1;
    self.configuration.discretionary = YES;
    self.configuration.timeoutIntervalForResource = 60*60;
    self.configuration.timeoutIntervalForRequest  = 60*60;
    backgroundSession = [NSURLSession sessionWithConfiguration:self.configuration delegate:self delegateQueue:nil];
Run Code Online (Sandbox Code Playgroud)

因此问题仅适用于大文件,对于小文件,执行上载.还有其他人遇到过同样的问题吗?

file-upload objective-c ios nsurlsession nsurlsessionuploadtask

5
推荐指数
1
解决办法
1577
查看次数

NSURLSession,上传任务 - 获取实际传输的字节数

我收到错误报告,我的iOS应用程序无法在慢速连接上传图像.虽然我的超时可能不够高,但还有另一个问题.

我发现上传进度很快就达到了100%,尽管我在查尔斯看到字节仍在传输中.我使用NSURLSession的以下方法:

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
                                     fromData:(NSData *)bodyData
                            completionHandler:(void (^)(NSData *data,
                                                        NSURLResponse *response,
                                                        NSError *error))completionHandler
Run Code Online (Sandbox Code Playgroud)

并实现以下委托方法来接收进度事件:

- (void)URLSession:(NSURLSession *)session
              task:(NSURLSessionTask *)task
   didSendBodyData:(int64_t)bytesSent
    totalBytesSent:(int64_t)totalBytesSent
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
Run Code Online (Sandbox Code Playgroud)

实际上我正在使用AFNetworking 2.5.2,它使用这种方法.我的理论是这个委托方法报告从电话发送的字节而不是实际传输的字节.

在非常低的连接下发送300kb将立即发送5-6个包并在等待它们被接收时报告100%的进度.

是否可以获得已确认已传输的实际字节数的进度事件?

ios afnetworking-2 nsurlsession nsurlsessionuploadtask

5
推荐指数
1
解决办法
3233
查看次数

为 backgroundSession.uploadTask 实现完成处理程序

我已经(几乎)成功实现了URLSessionDelegate, URLSessionTaskDelegate, 并且URLSessionDataDelegate这样我就可以在后台上传我的对象。但是我不确定如何实现完成处理程序,以便在服务器返回时删除我发送的对象statuscode=200

我目前开始uploadTask这样

let configuration = URLSessionConfiguration.background(withIdentifier: "com.example.myObject\(myObject.id)")
let backgroundSession = URLSession(configuration: configuration, 
                                   delegate: CustomDelegate.sharedInstance, 
                                   delegateQueue: nil)
let url: NSURL = NSURL(string: "https://www.myurl.com")!
let urlRequest = NSMutableURLRequest(url: url as URL)

urlRequest.httpMethod = "POST"
urlRequest.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

let uploadTask = backgroundSession.uploadTask(with: urlRequest as URLRequest, fromFile: path)

uploadTask.resume()
Run Code Online (Sandbox Code Playgroud)

我尝试在初始化中添加一个闭包,uploadTask但 xcode 显示一个错误,这是不可能的。

我有我的自定义类 CustomDelegate:

class CustomDelegate : NSObject, URLSessionDelegate, URLSessionTaskDelegate, URLSessionDataDelegate {

static var sharedInstance = CustomDelegate()

func urlSession(_ session: URLSession, …
Run Code Online (Sandbox Code Playgroud)

nsurlsessionuploadtask swift nsurlsessiondatatask

5
推荐指数
1
解决办法
3275
查看次数