【问题标题】:How can i upload file and other parameter using NSURLConnection如何使用 NSURLConnection 上传文件和其他参数
【发布时间】:2012-06-13 22:32:04
【问题描述】:

我正在使用NSURLConnection 将相同的数据 (NSString) 发送到服务器,我想与它们一起添加图像或文件,那么内容类型的值是什么?

编码

- (NSData *)encodingData:(NSMutableDictionary *)dictionary
{
    NSMutableArray *arrayPosts = [[NSMutableArray alloc] init];
    [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
         NSString *encodedKey = [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
         NSString *encodedValue = [obj stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        [arrayPosts addObject:[NSString stringWithFormat:@"%@=%@",encodedKey,encodedValue]];
    }];
    NSString *encodedArrayPosts = [arrayPosts componentsJoinedByString:@"&"];
    return [encodedArrayPosts dataUsingEncoding:NSUTF8StringEncoding];
}

发送数据

- (void)startAsyncRequest
{
   // Enable the network activity indicator in the status bar
   [self enableActivityIndicatorInStatusBar];

   // Setting of the request
   NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:self.url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0];
   [urlRequest setHTTPMethod:self.method];
   [urlRequest setHTTPBody:[self encodingData:self.dictionaryPosts]];

   // Send the request
   NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];

   if (connection) {
      // Connection succeded 
     self.receiveData = [NSMutableData data];
   } else {
      // Connection Failed
      self.error = @"Connection Failed";
      // Inform the user that the connection failed
      [self.delegate requestFailed:self];
   }
}

【问题讨论】:

    标签: iphone cocoa-touch ipad nsurlconnection nsmutableurlrequest


    【解决方案1】:

    您需要将数据作为流类型传递到您的服务器中

    public InsertImage(Stream stream)
    

    类似的东西然后解析流类型。

    这是使用某些边界构建请求的方法

    - (NSURLRequest *)buildRequest:(NSData *)paramData fileName:(NSString *)name {
        NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
        NSString *charset = (NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
        [request setURL:self.url];
        [request setHTTPMethod:self.method];
    
        NSString *boundary = @"0xKhTmLbOuNdArY";
        NSString *endBoundary = [NSString stringWithFormat:@"\r\n--%@\r\n", boundary];
    
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; charset=%@; boundary=%@", charset, boundary];
        [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
    
        NSMutableData *tempPostData = [NSMutableData data]; 
        [tempPostData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
        // Sample Key Value for data
        [tempPostData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"Key_Param"] dataUsingEncoding:NSUTF8StringEncoding]];
        [tempPostData appendData:@"Value_Param"] dataUsingEncoding:NSUTF8StringEncoding]];
        [tempPostData appendData:[endBoundary dataUsingEncoding:NSUTF8StringEncoding]];
    
        // Sample file to send as data
        [tempPostData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n", name] dataUsingEncoding:NSUTF8StringEncoding]];
        [tempPostData appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [tempPostData appendData:paramData];
        [tempPostData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [request setHTTPBody:tempPostData];
        return request;
    }
    

    您应该在服务器端获取流类型数据并对其进行解析,您可以根据传递的 Key 获取值,例如Key_Param,以及您发送的文件的名称(fileName)。

    【讨论】:

    • 但是我怎样才能将它们混合在一起,我的意思是文件和简单数据?
    • @Tamim.Z 上面的代码数据的示例键值用于简单数据,而另一个是文件
    猜你喜欢
    • 2020-12-14
    • 2011-09-04
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2021-10-15
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多