2013-03-20 38 views
9

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

btw。插座打开并连接。

这里是我的代码:

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]]; 
+0

你有没有尝试过不同的JPEG压缩?像(image,0.4f) – ApolloSoftware 2013-03-20 15:02:07

+0

我在想它是否超过了大小限制阈值 – ApolloSoftware 2013-03-20 15:02:25

+0

你可以尝试将图像写入内存(缓冲区)并尝试渲染恢复的图像吗?我试图在内存中执行此操作,并且它可以很好地处理1024 x 683照片。以下是一些示例代码:https://gist.github.com/abellina/5205633。 – abellina 2013-03-20 15:37:46

回答

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 
+0

太好了。我现在要使用它! – 2014-07-31 18:07:25

5

这是因为你的图像尺寸限制被突破。

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

发件人

  1. 转换UIimageNSData

  2. 拆分了NSData不同的数据块(1024每块被推荐)

  3. 发送&轨道NSData

    每块

接收机

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

  2. 接收的NSData下一大块并利用appendData:方法将其追加

  3. 一旦所有的块被接收时,将接收到的NSData作为UIImage

确保设计不同用于传输数据的结构,例如结构来表示细节(总块,总大小,块大小等),用于表示数据的结构(当前块大小,当前块数等),用于表示[R esponds数据(交付状态,大块数量交付等)。