2011-04-19 28 views
6

Dosyaları iPhone'umdan FTP ile karşıya yüklemekte sorun yaşıyorum.Birden çok dosyayı http POST kullanarak yükleme POST

Web servisime gerekli tüm parametrelerle bir HTTP POST isteği gönderiyorum. İki dosya gönderiyorum, bir resim, ikincisi ses. Resim yükleniyor, ancak ses yok. Web servisimi izlediğimde, sadece görüntü alanını yüklenen bir dosya olarak gösterir. Sesin de orada olduğunu göstermiyor.

Kodum: Ben resim yüklemek yoksa

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

, o zaman ses sürer. Bu yüzden istekle sadece bir dosya gönderebiliyorum. Lütfen bana yardım edin ve herhangi bir yerde yanılmadığımı söyle.

Şimdiden teşekkürler.

+0

Merhaba Kapil, Aynı sorunla karşı karşıyayım. Bu konuda bana yardımcı olabilir misiniz? –

+0

Ne yapıyorsun? Yaptığım yolu kullanarak birden fazla dosya yüklemeye mi çalışıyorsun? Görüntü verisini satır ile ekledikten sonra: '[postBody appendData: imageData];' replace: '[postBody appendData: [[NSString stringWithFormat: @" -% @ \ r \ n ", stringBoundary] dataUsingEncoding: NSUTF8StringEncoding] ]; '' ile [postBody appendData: [[NSString stringWithFormat: @ "\ r \ n -% @ \ r \ n", stringBoundary] dataUsingEncoding: NSUTF8StringEncoding]] '' Umarım bu yardımcı olur –

+0

Bu işe yaramaz .. Ben her zaman yardım etmek için buradayım –

cevap

2

Birden çok dosya göndermek için ASIHTTPRequest 's ASINetworkQueue'u kullanarak incelediniz mi?

UPDATE: ASIHTTPRequest artık yorumda bulunmuyor. Bu çerçeve ile dikkatli kullanın. Diğer seçenekler MKNetworkKit veya AFNetworking'dur.

+0

Evet, bu aynı zamanda iyi bir seçenek ama tüm kodumu değiştirmemek durumunda değilim .. Resim verisini ekledikten sonra '\ r \ n' 'ekleyerek aynı kodla bitti. Herhangi bir şekilde –

+1

teşekkürler ASIHTTPRequest, bu ve şimdi gönderildiği süre arasında kullanımdan kaldırılmıştır. Bunu okuyan herkes uygun bir miktarda dikkat göstermelidir. –

+1

Teşekkürler @StevenFisher: Cevabımı güncelledi –

0

Sınır ayarı konusunda sorun yaşayabilirsiniz.

kullanın bu sınır olarak

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

yerine Oldukça basit bu

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

Bu neredeyse bir yıl önce. Kendi sorumuyla ilgili yorumlar görürseniz, sorunumu nasıl çözdüğümü ve bunun cevabınızla aynı olduğunu zaten belirttim. Bu sorunu daha önce anlattığınız şekilde düzeltdim (yorumumu görebilirsiniz). Bana yardım etmeye çalıştığınız için yine de teşekkürler .. –

+1

En doğru cevabı kabul etmelisiniz; kabul edilen cevabınızı taşıyabilmeniz gerekir. –

7

bu

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

kullanın. Sadece multipart gövdesi oluştur.

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

FileUpload sınıfı oldukça önemsiz:

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

Artık herhangi bir şekilde sevk sadece yapabilirsiniz: 'params' sözlükte yüklenecek dosya ve düzenli params olduğunu varsayalım bir mesafede inşa url/dosyaadı, bu adı bir yöntem olarak sağlar ve ikili içeriği NSData'ya * yükler. Açıklık için listelemiyorum, ama gerekirse, ekleyeceğim.

+0

Bu paragrafta param nedir? –

+0

İsteğinizin parametreleriyle bir sözlüktür. – sergeych