Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用AFNetworking将.zip文件上载到REST服务器失败_Objective C_Macos_Rest_File Upload_Afnetworking 2 - Fatal编程技术网

Objective c 使用AFNetworking将.zip文件上载到REST服务器失败

Objective c 使用AFNetworking将.zip文件上载到REST服务器失败,objective-c,macos,rest,file-upload,afnetworking-2,Objective C,Macos,Rest,File Upload,Afnetworking 2,从AFNetworking文档中,我在尝试将文件上载到REST服务器时得到了以下代码,该服务器与其他客户端一起工作正常,但在我的实现中,由于内部服务器错误而崩溃 代码如下: - (BOOL)uploadFile:(NSString *)path apiKey:(NSString *)apiKey { NSData *symbolsData = [NSData dataWithContentsOfFile:path]; if (!symbolsData) { NS

从AFNetworking文档中,我在尝试将文件上载到REST服务器时得到了以下代码,该服务器与其他客户端一起工作正常,但在我的实现中,由于内部服务器错误而崩溃

代码如下:

- (BOOL)uploadFile:(NSString *)path apiKey:(NSString *)apiKey
{
    NSData *symbolsData = [NSData dataWithContentsOfFile:path];

    if (!symbolsData) {
        NSLog(@"Symbols file at %@ does not exist.", path);
        return NO;
    }

    if ([symbolsData length] > 33554432) {
        NSLog(@"Symbols file at %@ is too large to upload.", path);
        return NO;
    }

    NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:[NSString stringWithFormat:@"%@/upload/thefile", BaseURL] parameters:nil constructingBodyWithBlock:
        ^(id<AFMultipartFormData> formData)
            {
            [formData appendPartWithFileData:symbolsData name:@"file" fileName:[path lastPathComponent] mimeType:@"application/zip"];
            }
        error:nil];
    [request setValue:apiKey forHTTPHeaderField:@"X-theapikey"];

    AFURLSessionManager* manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

    NSURLSessionUploadTask* uploadTask = [manager uploadTaskWithStreamedRequest:request progress:nil completionHandler:
        ^(NSURLResponse *response, id responseObject, NSError *error)
            {
            if (!error)
                {
                NSLog(@"Successfully uploade file: %@\r\nwith Response: %@", [path lastPathComponent], (NSString*)responseObject);
                }
            else
                {
                NSLog(@"There was an error while uploading the file: %@", [error description]);
                }
            }];

    [uploadTask resume];

    return YES;
}
在互联网上搜索之后,我看到了很多实现,MIME类型变为application/octet-stream和其他东西,但没有任何效果

还添加了AFNetworkActivityLogger并注册到NSNotificationCenter以检查请求:

Request: <NSMutableURLRequest: 0x600000014680> { URL: http://IP_ADDRESS:3000/upload/thefile }
2014-05-28 03:03:16.112 MyMacApp[5092:303] POST 'http://IP_ADDRESS:3000/upload/thefile': {
    "Accept-Language" = "en;q=1, ja;q=0.9, fr;q=0.8, de;q=0.7, es;q=0.6, it;q=0.5";
    "Content-Length" = 817739;
    "Content-Type" = "multipart/form-data; boundary=Boundary+E25BB25240379DA8";
    "User-Agent" = "MyMacApp/1.1 (Mac OS X Version 10.9.3 (Build 13D65))";
    "X-thapikey" = 9e301234;
} (null)
请求:{URL:http://IP_ADDRESS:3000/upload/thefile }
2014-05-28 03:03:16.112 MyMacApp[5092:303]POST'http://IP_ADDRESS:3000/upload/thefile': {
“接受语言”=“en;q=1,ja;q=0.9,fr;q=0.8,de;q=0.7,es;q=0.6,it;q=0.5”;
“内容长度”=817739;
“内容类型”=“多部分/表单数据;边界=边界+E25BB25240379DA8”;
“用户代理”=“MyMacApp/1.1(Mac OS X版本10.9.3(构建13D65))”;
“X-thapikey”=9e301234;
}(空)
我可以看到内容类型看起来不错,并且有一个内容长度

编辑: 引发服务器异常:

java.lang.NullPointerException
  at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:997)
  at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:901)
  at java.io.InputStream.read(InputStream.java:101)
  at org.apache.commons.fileupload.util.Streams.copy(Streams.java:101)
  at org.apache.commons.fileupload.util.Streams.copy(Streams.java:70)
  at org.apache.commons.fileupload.MultipartStream.readBodyData(MultipartStream.java:589)
  at org.apache.commons.fileupload.MultipartStream.discardBodyData(MultipartStream.java:613)
  at org.apache.commons.fileupload.MultipartStream.skipPreamble(MultipartStream.java:630)
  at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:1018)
  at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:998)
  at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:310)
  at ring.middleware.multipart_params$file_item_seq.invoke(multipart_params.clj:39)
  at ring.middleware.multipart_params$parse_multipart_params.invoke(multipart_params.clj:55)
  at ring.middleware.multipart_params$multipart_params_request.doInvoke(multipart_params.clj:81)
  at clojure.lang.RestFn.invoke(RestFn.java:423)
  at ring.middleware.multipart_params$wrap_multipart_params$fn__853.invoke(multipart_params.clj:107)
  at ring.middleware.flash$wrap_flash$fn__1860.invoke(flash.clj:31)
  at ring.middleware.session$wrap_session$fn__1847.invoke(session.clj:85)
  at ring.middleware.json$wrap_json_body$fn__623.invoke(json.clj:21)
  at ring.middleware.json$wrap_json_response$fn__634.invoke(json.clj:42)
  at clojure.lang.Var.invoke(Var.java:415)
  at org.httpkit.server.HttpHandler.run(RingHandler.java:91)
  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
  at java.util.concurrent.FutureTask.run(FutureTask.java:262)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  at java.lang.Thread.run(Thread.java:744)
java.lang.NullPointerException
  在org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:997)
  位于org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:901)
  读取(InputStream.java:101)
  位于org.apache.commons.fileupload.util.Streams.copy(Streams.java:101)
  位于org.apache.commons.fileupload.util.Streams.copy(Streams.java:70)
  位于org.apache.commons.fileupload.MultipartStream.readBodyData(MultipartStream.java:589)
  位于org.apache.commons.fileupload.MultipartStream.discardBodyData(MultipartStream.java:613)
  位于org.apache.commons.fileupload.MultipartStream.skipPreamble(MultipartStream.java:630)
  位于org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:1018)
  位于org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.(FileUploadBase.java:998)
  位于org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:310)
  在ring.middleware.multipart_params$file_item_seq.invoke(multipart_params.clj:39)
  在ring.middleware.multipart_params$parse_multipart_params.invoke(multipart_params.clj:55)
  at ring.middleware.multipart_params$multipart_params_request.doInvoke(multipart_params.clj:81)
  位于clojure.lang.RestFn.invoke(RestFn.java:423)
  在ring.middleware.multipart_params$wrap_multipart_params$fn__853.invoke(multipart_params.clj:107)
  flash$wrap\u flash$fn\uu 1860.invoke(flash.clj:31)
  在ring.middleware.session$wrap\u session$fn\uu 1847.invoke(session.clj:85)
  在ring.middleware.json$wrap\u json\u body$fn\u\u 623.invoke(json.clj:21)
  在ring.middleware.json$wrap\u json\u response$fn\u\u 634.invoke(json.clj:42)
  在clojure.lang.Var.invoke(Var.java:415)
  位于org.httpkit.server.HttpHandler.run(RingHandler.java:91)
  位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
  在java.util.concurrent.FutureTask.run(FutureTask.java:262)处
  位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  运行(Thread.java:744)
如何调试并找出我的请求失败的原因

服务器接受文件,并使用其他客户端、POSTman、Cocoa REST客户端对其进行测试


谢谢。

通过删除AFNetworking并使用Apple的NSURLRequest、NSURLConnection类以及stackoverflow中的一些搜索找到了答案

我应该提到的是,这可能是服务器不支持AFNetworking请求,或者请求不能与所有服务器一起工作

我的工作代码:

- (NSMutableURLRequest *)buildRequest:(NSData *)paramData fileName:(NSString *)name
    {
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/upload/thefile", BaseURL]]];
    [request setHTTPMethod:@"POST"];

    NSString *boundary = @"0xKhTmLbOuNdArY";
    NSString *endBoundary = [NSString stringWithFormat:@"\r\n--%@--", boundary];

    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];

    NSMutableData *tempPostData = [NSMutableData data]; 
    [tempPostData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    // Sample file to send as data
    [tempPostData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"\r\n", name] dataUsingEncoding:NSUTF8StringEncoding]];
    [tempPostData appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [tempPostData appendData:paramData];
    [tempPostData appendData:[endBoundary dataUsingEncoding:NSUTF8StringEncoding]];
    [request setHTTPBody:tempPostData];

    return request;
    }

- (BOOL) uploadSymbols:(NSString*)path apiKey:(NSString*)apiKey
    {
    NSData *symbolsData = [NSData dataWithContentsOfFile:path];

    if (!symbolsData) {
        NSLog(@"Symbols file at %@ does not exist.", path);
        return NO;
    }

    if ([symbolsData length] > 33554432) {
        NSLog(@"Symbols file at %@ is too large to upload.", path);
        return NO;
    }

    NSMutableURLRequest* request = [self buildRequest:symbolsData fileName:[path lastPathComponent]];
    [request setValue:apiKey forHTTPHeaderField:@"X-theapikey"];
    [NSURLConnection sendAsynchronousRequest:request queue:self.queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
       NSLog(@"End.");
    }];
    return true;
    }
- (NSMutableURLRequest *)buildRequest:(NSData *)paramData fileName:(NSString *)name
    {
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/upload/thefile", BaseURL]]];
    [request setHTTPMethod:@"POST"];

    NSString *boundary = @"0xKhTmLbOuNdArY";
    NSString *endBoundary = [NSString stringWithFormat:@"\r\n--%@--", boundary];

    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];

    NSMutableData *tempPostData = [NSMutableData data]; 
    [tempPostData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    // Sample file to send as data
    [tempPostData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"\r\n", name] dataUsingEncoding:NSUTF8StringEncoding]];
    [tempPostData appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [tempPostData appendData:paramData];
    [tempPostData appendData:[endBoundary dataUsingEncoding:NSUTF8StringEncoding]];
    [request setHTTPBody:tempPostData];

    return request;
    }

- (BOOL) uploadSymbols:(NSString*)path apiKey:(NSString*)apiKey
    {
    NSData *symbolsData = [NSData dataWithContentsOfFile:path];

    if (!symbolsData) {
        NSLog(@"Symbols file at %@ does not exist.", path);
        return NO;
    }

    if ([symbolsData length] > 33554432) {
        NSLog(@"Symbols file at %@ is too large to upload.", path);
        return NO;
    }

    NSMutableURLRequest* request = [self buildRequest:symbolsData fileName:[path lastPathComponent]];
    [request setValue:apiKey forHTTPHeaderField:@"X-theapikey"];
    [NSURLConnection sendAsynchronousRequest:request queue:self.queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
       NSLog(@"End.");
    }];
    return true;
    }