9

我正在尝试将用户拍摄的图像发送到服务器。我得到 JPEG 表示,将其附加到上传照片所需的字符串,然后通过 NSOutputStream 发送数据。但是,当我尝试从服务器取回照片时,我只能从顶部看到 10% 的照片。任何帮助,将不胜感激。

顺便提一句。套接字已打开并已连接。

这是我的代码:

NSString *requestString = [NSString stringWithFormat:@"SubmitPhoto::%@::", userID];
NSData * stringData = [requestString dataUsingEncoding:NSUTF8StringEncoding];

NSData *imgData = UIImageJPEGRepresentation(image, 1.0);

NSMutableData *completeData = [[NSMutableData alloc] initWithBytes:[stringData bytes] length:[stringData length]];
[completeData appendData:imgData];

//sending NSData over to server
[self.outputStream write:[completeData bytes] maxLength:[completeData length]];
4

2 回答 2

5

这是因为超出了您的图像大小限制。

处理此问题的更好方法是实现以下逻辑。

发件人

  1. 转换UIimageNSData

  2. 拆分NSData成不同的块(建议每个块 1024 个)

  3. 发送和跟踪每一块NSData

接收者

  1. 声明NSData并存储块的第一部分NSData(1024)到它,它被接收。

  2. 接收下一块NSData并使用appendData:方法来附加它

  3. 收到所有块后,将收到的块转换NSDataUIImage

确保设计不同的结构来将数据传输为块,例如表示细节的结构(总块、总大小、块大小等),表示数据的结构(当前块大小、当前块数等) ,表示响应数据的结构(交付状态,交付的块数等)。

于 2013-03-20T17:11:20.503 回答
3

我猜您只是想一次为缓冲区写入太多数据。做这样的事情来循环数据并以块的形式发送它:

    NSString *requestString = [NSString stringWithFormat:@"SubmitPhoto::%@::", userID];
    NSData * stringData = [requestString dataUsingEncoding:NSUTF8StringEncoding];

    NSData *imgData = UIImageJPEGRepresentation(image, 1.0);

    NSMutableData *completeData = [[NSMutableData alloc] initWithBytes:[stringData bytes] length:[stringData length]];
    [completeData appendData:imgData];

    NSInteger bytesWritten = 0;
    while ( completeData.length > bytesWritten )
    {
        while ( ! self.outputStream.hasSpaceAvailable )
            [NSThread sleepForTimeInterval:0.05];

        //sending NSData over to server
        NSInteger writeResult = [self.outputStream write:[completeData bytes]+bytesWritten maxLength:[completeData length]-bytesWritten];
        if ( writeResult == -1 ) {
            NSLog(@"error code here");
        }
        else {
            bytesWritten += writeResult;
        }
    }
}
// Both input and output should be closed to make the code work in swift
于 2013-03-20T16:28:15.367 回答