2011-04-19 37 views
6

Tôi gặp sự cố khi tải tệp lên bằng FTP từ ứng dụng iPhone của mình.Tải lên nhiều tệp bằng http POST

Tôi đang gửi yêu cầu HTTP POST tới dịch vụ web của mình với tất cả các thông số cần thiết. Tôi đang gửi hai tệp, một tệp là một hình ảnh và tệp thứ hai là âm thanh. Hình ảnh đang được tải lên nhưng âm thanh thì không. Khi tôi theo dõi dịch vụ web của mình, nó chỉ hiển thị trường hình ảnh dưới dạng tệp được tải lên. Nó không cho thấy âm thanh cũng ở đó.

Mã của tôi là:

NSString *urlString = [NSString stringWithFormat:ADD_LEAD_API_URL]; 

NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]]; 



// change type to POST (default is GET) 
[postRequest setHTTPMethod:@"POST"]; 


// just some random text that will never occur in the body 
NSString *stringBoundary = @"0xKhTmLbOuNdArY---This_Is_ThE_BoUnDaRyy---pqo"; 

// header value 
NSString *headerBoundary = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary]; 

// set header 
[postRequest addValue:headerBoundary forHTTPHeaderField:@"Content-Type"]; 

// create data 
NSMutableData *postBody = [NSMutableData data]; 



[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"userId\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[appDelegate.objCurrentUser.userId dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];  


// message part 
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"firstName\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[firstName dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

/*** My rest of string parameters are successfully added to request ***/ 


// media part 
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"imageUrl\"; filename=\"dummy.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[@"Content-Type: image/jpeg\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    // get the image data from main bundle directly into NSData object 

UIImage *img= leadImage; 
NSData *imageData= UIImageJPEGRepresentation(img,90); 

[postBody appendData:imageData]; 

// Image is being uploaded 

[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"recordSoundUrl\"; filename=\"%@\"\r\n", self.recordingPath] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[@"Content-Type: application/octet-stream\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 


NSData *soundData = [NSData dataWithContentsOfFile:[appDelegate.documentDir stringByAppendingPathComponent:self.recordingPath]]; 
[postBody appendData:soundData]; 
[postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

// final boundary 
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

// add body to post 
[postRequest setHTTPBody:postBody]; 

// Asynch request 
NSURLConnection *conn = [NSURLConnection connectionWithRequest:postRequest delegate:self]; 

Nếu tôi không tải lên các hình ảnh, sau đó phải mất âm thanh. Vì vậy, tôi chỉ có thể gửi một tệp với yêu cầu. Hãy giúp tôi và cho tôi biết nếu tôi sai ở bất cứ đâu.

Xin cảm ơn trước.

+0

Xin chào, tôi đang gặp phải sự cố tương tự. Bạn có thể giúp tôi trong việc này không. –

+0

Bạn đang làm gì? Bạn đang cố gắng tải lên nhiều tệp bằng cách tôi đã làm chưa? Nếu như sau khi thêm dữ liệu hình ảnh với dòng: '[postBody appendData: imageData];' replace: '[postBody appendData: [[NSString stringWithFormat: @" -% @ \ r \ n ", stringBoundary] dataUsingEncoding: NSUTF8StringEncoding] ]; 'với' [postBody appendData: [[NSString stringWithFormat: @ "\ r \ n -% @ \ r \ n", stringBoundary] dataUsingEncoding: NSUTF8StringEncoding]]; '... Hy vọng điều này sẽ giúp –

+0

cho tôi biết nếu điều này không hoạt động .. Tôi luôn ở đây để giúp đỡ –

Trả lời

2

Bạn đã xem sử dụng của để gửi nhiều tệp.

CẬP NHẬT: Theo nhận xét bên dưới, ASIHTTPRequest không còn được duy trì. Hãy thận trọng với khung này. Các tùy chọn khác là MKNetworkKit hoặc AFNetworking.

+0

Vâng đây cũng là một lựa chọn tốt nhưng tôi không có điều kiện thay đổi toàn bộ mã của tôi .. Nó được thực hiện với cùng mã của tôi bằng cách thêm '" \ r \ n "' sau khi thêm dữ liệu hình ảnh. Cảm ơn bất kỳ cách nào –

+1

Lưu ý rằng ASIHTTPRequest đã không được chấp nhận giữa thời gian này đã được đăng và bây giờ. Bất cứ ai đọc điều này nên sử dụng một lượng thận trọng thích hợp. –

+1

Cảm ơn @StevenFisher: Đã cập nhật câu trả lời của tôi –

0

bạn có thể gặp sự cố khi đặt ranh giới.

Sử dụng này là ranh giới

NSString boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; 

và sử dụng này

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

thay vì điều này

[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
+1

Bài đăng gần một năm cũ này. Nếu bạn thấy bình luận về câu hỏi của chính tôi, tôi đã đề cập đến cách tôi giải quyết vấn đề của mình và điều đó cũng giống như câu trả lời của bạn. Tôi đã khắc phục sự cố này bằng cách bạn đã nói (bạn có thể xem nhận xét của tôi). Cảm ơn anyway vì đã cố gắng giúp tôi .. –

+1

Bạn nên chấp nhận câu trả lời đúng nhất; bạn sẽ có thể di chuyển câu trả lời được chấp nhận của mình. –

7

Nó là khá đơn giản. Chỉ cần hình thành cơ thể đa phần. Giả sử bạn có các tập tin để tải lên và params thường xuyên trong 'params' từ điển:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString: urlString] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:54.0]; 

NSMutableData* body = [NSMutableData data]; 

NSString* boundary = [NSString randomStringWithLength:64]; 
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"]; 
NSData *boundaryData = [[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]; 

[params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
    [body appendData:boundaryData]; 
    // I use special simple class to distinguish file params 
    if([obj isKindOfClass:[FileUpload class]]) { 
     // File upload 
     [body appendData: [[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n\r\n", key, [obj localName]] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData: [obj loadData]]; // It just return NSData with loaded file in it 
     [body appendData: [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    } 
    else { 
     // Regular param 
     [body appendData: [[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n", key, obj] dataUsingEncoding:NSUTF8StringEncoding]] 
    } 
}]; 
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

[request setValue:[NSString stringWithFormat:@"%d", [body length]] forHTTPHeaderField:@"Content-Length"]; 
[request setHTTPBody:body]; 

Bây giờ bạn chỉ có thể gửi nó trong bất kỳ cách nào:

[NSURLConnection sendAsynchronousRequest:request 
            queue:queueOfYourChoice 
         completionHandler:^(NSURLResponse *response, NSData *rdata, NSError *error) 

lớp FileUpload là khá tầm thường: nó xây dựng từ một url/filename, cung cấp tên này làm phương thức và tải nội dung nhị phân vào NSData *. Tôi không liệt kê nó cho rõ ràng, nhưng nếu cần, tôi sẽ thêm.

+0

params trong sir này là gì? –

+0

Nó là một từ điển với các tham số của yêu cầu của bạn. – sergeych

Các vấn đề liên quan