2012-06-18 34 views
3

我目前正在通過HTTP Post將圖像上傳到服務器,並且似乎無法找到構建調用該服務的url的方法。用戶從庫或照相機中選擇一個圖像,然後調用執行插入語句的json服務。通過目標C中的POST上傳圖像

該服務在需要下列uritemplate:

@"%@/DataTransfer/SetUserProfileImage?EMP_ID=%@&image=%@&imageName=%@" 

它期待的是,圖像數據被某種方式轉換爲字符串,並在URL發送。

這是我當前的代碼:

- (BOOL)setUserProfileImage:(UIImage *)imgUser Name:(NSString *)strName{ 

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    NSData *dataImage = UIImagePNGRepresentation(imgUser); 

    NSString* theNSString = [[NSString alloc] initWithData:dataImage encoding:NSASCIIStringEncoding]; 

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/DataTransfer /SetUserProfileImage?EMP_ID=%@&" 
            "image=%@&imageName=%@", 
            appDelegate.ServerAddress, 
            appDelegate.UserId, 
            theNSString, 
            strName]]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
                 cachePolicy: NSURLRequestUseProtocolCachePolicy 
                timeoutInterval:10.0]; 

    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 


    NSURLResponse* response = nil; 
    NSError* resultError = nil; 

    NSData* data = [NSURLConnection sendSynchronousRequest:request 
            returningResponse:&response 
               error:&resultError]; 

    NSString *strResult = [[NSString alloc] initWithBytes:[data bytes] 
               length:[data length] 
              encoding:NSUTF8StringEncoding]; 

    BOOL imgResponse = [strResult boolValue]; 
    [strResult release]; 

    return imgResponse; 
} 

我得到一個錯誤說,NSURL是 「」。似乎無法構建正確的網址。我知道服務本身再次將此字符串轉換爲圖像。

UPDATE:

- (BOOL)setUserProfileImage:(UIImage *)imgUser Name:(NSString *)strName{ 

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

NSString *url = [NSString stringWithFormat:@"%@/DataTransfer/SetUserProfileImage",appDelegate.ServerAddress]; 

NSData *data = UIImagePNGRepresentation(imgUser); 

NSString * boundary = @"tweetPhotoBoundaryParm"; 
NSMutableData *postData = [NSMutableData dataWithCapacity:[data length] + 1024]; 

name=\"EMP_ID\"\r\n\r\n%@", @"100-01"]; 
NSString * boundaryString = [NSString stringWithFormat:@"\r\n--%@\r\n", boundary]; 
NSString * boundaryStringFinal = [NSString stringWithFormat:@"\r\n--%@--\r\n", boundary]; 


[postData appendData:[boundaryString dataUsingEncoding:NSUTF8StringEncoding]];  
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"image\";\r\nfilename=\"media.png\"\r\nContent-Type: image/png\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postData appendData:data]; 
[postData appendData:[boundaryStringFinal dataUsingEncoding:NSUTF8StringEncoding]]; 

NSMutableURLRequest * theRequest=(NSMutableURLRequest*)[NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] 
                      cachePolicy:NSURLRequestUseProtocolCachePolicy 
                     timeoutInterval:60.0]; 

[theRequest setHTTPMethod:@"POST"]; 

[theRequest addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"]; 
//[theRequest addValue:@"www.tweetphoto.com" forHTTPHeaderField:@"Host"]; 
NSString * dataLength = [NSString stringWithFormat:@"%d", [postData length]]; 
[theRequest addValue:dataLength forHTTPHeaderField:@"Content-Length"]; 
[theRequest setHTTPBody:(NSData*)postData]; 

NSURLConnection * theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
if (theConnection) 
{ 
    webData =[[NSMutableData data] retain]; 
} 
else 
{ 
    NSLog(@"%@",@"Could not connect to the network"); 
} 

return false; 
} 
+0

這的確是零。嘗試生成一個NSString,用NSLog打印它,當你正確的時候,用它構建一個NSURL。 – Jano

回答

3

這種方法有幾個問題。

1)將圖像的原始字節轉換爲字符串將永遠不會工作。

NSData *dataImage = UIImagePNGRepresentation(imgUser); 
NSString* theNSString = [[NSString alloc] initWithData:dataImage encoding:NSASCIIStringEncoding]; 

會失敗。你將永遠無法從theNSString重建dataImage。您需要基於64位編碼dataImage。使用像this這樣的東西做基地64編碼。

2)不要將圖像數據放入URL中。您需要將圖像數據放入後置主體中。 3)不要使用「application/x-www-form-urlencoded」,使用「multipart/form-data」。


評論

對不起後更新,但它看起來像你有很多的工作在瞭解您的製做。

在上面的示例中,您將所有數據添加到了URL查詢字符串,但沒有在消息正文中添加任何內容。在該例中,您將內容類型設置爲「application/x-www-form-urlencoded」。

現在你似乎認爲POST需要使用JSON。你需要弄清楚應該怎麼做。那個JSON消息是如何連接的?在你說數據需要在URL中之前,這仍然是這種情況嗎?如果您需要將JSON消息附加到POST正文,POST的內容類型需要是什麼?什麼是JSON消息的結構(需要所有的鍵/值字段)?

之前有人可以幫助你,你需要找到確切什麼是需要的。應該有人可以給你一個HTTP消息的準確描述。

+0

如何將圖像數據放入帖子主體中?如果url期望圖片在url中,這有什麼關係嗎? – Angie

+0

NSMutableURLRequest有一個方法'-setHTTPBody:'。您需要使用此方法設置整個帖子主體。 –

+0

我的猜測是你的後端系統結合了POST主體和查詢字符串參數,所以你只需要把圖像數據放在帖子主體中。如果您確實需要URL中的圖像數據的URL端點,則需要更改URL端點。 –

5

Objective-C的

-(void)saveImageToServer 
{ 
    // COnvert Image to NSData 
    NSData *dataImage = UIImageJPEGRepresentation([UIImage imageNamed:@"yourImage"], 1.0f); 

    // set your URL Where to Upload Image 
    NSString *urlString = @"Your URL HERE"; 

    // set your Image Name 
    NSString *filename = @"YourImageFileName"; 

    // Create 'POST' MutableRequest with Data and Other Image Attachment. 
    NSMutableURLRequest* request= [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:urlString]]; 
    [request setHTTPMethod:@"POST"]; 
    NSString *boundary = @"---------------------------14737809831466499882746641449"; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 
    NSMutableData *postbody = [NSMutableData data]; 
    [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@.jpg\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [postbody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [postbody appendData:[NSData dataWithData:dataImage]]; 
    [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [request setHTTPBody:postbody]; 

    // Get Response of Your Request 
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
    NSString *responseString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
    NSLog(@"Response %@",responseString); 
} 

斯威夫特

// COnvert Image to NSData 
var dataImage: NSData = UIImageJPEGRepresentation(UIImage(named: "yourImage"), 1.0) 
// set your URL Where to Upload Image 
var urlString: String = "Your URL HERE" 
// set your Image Name 
var filename: String = "YourImageFileName" 
// Create 'POST' MutableRequest with Data and Other Image Attachment. 
var request: NSMutableURLRequest = NSMutableURLRequest() 
request.URL = NSURL(string: urlString)! 
request.HTTPMethod = "POST" 
var boundary: String = "---------------------------14737809831466499882746641449" 
var contentType: String = "multipart/form-data; boundary=\(boundary)" 
request.addValue(contentType, forHTTPHeaderField: "Content-Type") 
var postbody: NSMutableData = NSMutableData.data() 
postbody.appendData("\r\n--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)) 
postbody.appendData("Content-Disposition: form-data; name=\"userfile\"; filename=\"\(filename).jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)) 
postbody.appendData(String.stringWithString("Content-Type: application/octet-stream\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)) 
postbody.appendData(NSData.dataWithData(dataImage)) 
postbody.appendData("\r\n--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)) 
request.HTTPBody = postbody 
// Get Response of Your Request 
var returnData: NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil) 
var responseString: String = String(data: returnData, encoding: NSUTF8StringEncoding) 
NSLog("Response %@", responseString) 
+0

如何在此處傳遞uiimage –

+0

@chiragbhalara檢查第一行代碼 –