2013-03-20 25 views
9

Tôi đang cố gắng gửi hình ảnh mà người dùng đến máy chủ. Tôi nhận được biểu diễn JPEG, gắn thêm vào chuỗi cần thiết để tải ảnh lên, sau đó gửi dữ liệu qua NSOutputStream. Tuy nhiên, khi tôi cố gắng để có được hình ảnh trở lại từ máy chủ, tôi chỉ nhìn thấy 10% của nó từ đầu trang. Bất kỳ trợ giúp sẽ được đánh giá cao.Gửi UIImage qua NSOutputStream

btw. ổ cắm được mở và kết nối.

Dưới đây là mã của tôi:

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

bạn đã thử nén JPEG khác nhau chưa? như (hình ảnh, 0.4f) – ApolloSoftware

+0

Tôi tự hỏi nếu ngưỡng giới hạn kích thước của nó có bị vượt quá không? – ApolloSoftware

+0

Bạn có thể thử ghi ảnh vào bộ nhớ (bộ nhớ đệm) và cố gắng hiển thị ảnh đã phục hồi không? Tôi đã cố gắng để làm điều này trong bộ nhớ và nó làm việc tốt cho một bức ảnh 1024 x 683. Dưới đây là một số mã mẫu: https://gist.github.com/abellina/5205633. – abellina

Trả lời

3

Tôi đoán bạn chỉ cần cố gắng để ghi dữ liệu quá nhiều tại một thời điểm cho đệm của bạn. Làm một cái gì đó như thế này để lặp qua các dữ liệu và gửi nó trong khối thay vì:

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

Tuyệt vời. Tôi sẽ sử dụng nó ngay bây giờ! –

5

Đó là vì kích thước hình ảnh giới hạn của bạn đang bị vượt quá.

Cách tốt hơn để xử lý việc này là triển khai logic sau đây.

Tên người gửi

  1. Chuyển đổi UIimage để NSData

  2. Tách lên NSData đến khối khác nhau (1024 mỗi đoạn được khuyến khích)

  3. Gửi & theo dõi từng đoạn của NSData

Receiver

  1. Khai NSData và Lưu trữ phần đầu của NSData đoạn (1024) vào nó, mà nhận được.

  2. Nhận các khối tiếp theo của NSData và tận dụng appendData: phương pháp để thêm nó

  3. Một khi tất cả các khối được nhận, chuyển đổi nhận NSData như một UIImage

Hãy chắc chắn để thiết kế khác nhau các cấu trúc để chuyển dữ liệu thành các khối như cấu trúc để biểu diễn các chi tiết (tổng khối, kích thước tổng, kích thước chunk, vv ..), cấu trúc để biểu diễn dữ liệu (kích thước chunk hiện tại, số đoạn hiện tại, v.v ..), cấu trúc để biểu diễn r esponds dữ liệu (tình trạng giao hàng, số đoạn giao vv ..).