2015-02-05 32 views
5

我對JavaScript和節點js很新。 我正在從我的iPad應用程序上傳圖像以使用多方模塊來休息節點js(表達js)的api。使用多方上傳圖像從ipad應用程序到節點js服務器

這是我在目標c中的圖像上傳代碼。

NSData *imgData = UIImageJPEGRepresentation(img.image, 0.2); 
NSString *urlString = @"http://localhost:3000/api/uploadimage"; 
NSString *str = @"displayImage"; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 
[request setHTTPShouldHandleCookies:NO]; 
[request setTimeoutInterval:30]; 
[request setURL:[NSURL URLWithString:urlString]]; 

[request setHTTPMethod:@"POST"]; 

NSString *boundary = [NSString stringWithFormat:@"---------------------------14737809831464368775746641449"]; 

NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
[request setValue:contentType forHTTPHeaderField: @"Content-Type"]; 

NSMutableData *body = [NSMutableData data]; 

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"currentEventID\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"52344457901000006" dataUsingEncoding:NSUTF8StringEncoding]]; 

if (imgData) { 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    // [body appendData:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"displayImage\"; filename=\"myimage.jpg\"\r\n"]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"myimage.jpg\"\r\n", str] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:imgData]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
} 


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

[request setURL:[NSURL URLWithString:urlString]]; 
NSLog(@"HttpBody = %@",request.HTTPBody); 
connectionSave = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

請求正文數據打印在控制檯上。

對於在服務器端獲取圖像我引用此示例。 [https://github.com/strongloop/express/blob/master/examples/multipart/index.js][1]

在這個例子中,他們正在創建var form = new multiparty.Form();在post方法中。 但我從應用程序不是從瀏覽器發送圖像,所以我沒有任何形式的輸入類型被定義。我如何編寫這個REST API來獲取圖像和其他字符串參數?

var express = require('express'); 
var http = require('http'); 
var util = require('util') 
var multiparty = require('multiparty'); 

var app = express(); 
var bodyParser = require('body-parser'); 

app.use(bodyParser.urlencoded({ 
    extended: true 
})); 

app.use(bodyParser.json()); 

app.use(bodyParser.urlencoded({limit:'10mb', extended: true})); 
app.use(bodyParser.json({limit:'10mb'})); 

app.post('/api/uploadimage', function(req, res, next){ 
    var form = new multiparty.Form(); 

    console.log(req.body); 
}); 

此外,我得到req.body空。 在此先感謝! :)

+0

我不能說node.js的東西,但似乎是在添加'imgData'之後並且在最後一個「 - (邊界) - 」之前添加了一個額外的\ r \ n,終止。我的理解是,你只需要在有效載荷和下一個邊界分隔符之後的一個\ r \ n。 – Rob 2015-02-05 22:06:26

+0

謝謝,但我不認爲這會產生任何問題:) – jasmine 2015-02-06 20:26:21

+0

但有一個問題:你不必要地在文件末尾添加兩個字節'0d 0a'。事實證明,大多數圖像例程都會忽略這些額外的字節,但是這樣做不正確。 – Rob 2015-02-08 04:28:47

回答

4

你的目標代碼尋找完美。 您需要使用connect-multiparty模塊。 以下是保存文件的示例代碼。

app.post('/api/uploadimage', multipartMiddleware, function(req, res) { 
     console.log(req.body, req.files); // check console 

    fs.readFile(req.files.urForm-data_name.path, function (err, data) { 
      //here get the image name and other data parameters which you are sending like image name etc. 
      fs.writeFile(newPath, data, function (err) { 
      }); 
    //dont forgot the delete the temp files. 
     }); 
    }); 
+0

謝謝。我正在處理它,並且能夠在臨時位置找到該文件。再次感謝!! – jasmine 2015-02-06 20:27:24

+0

如何刪除臨時文件? @jasmine – 2016-08-24 16:08:25

+0

@ChenyaZhang你可以使用fs.unlink(臨時文件路徑) – Rahul 2016-08-25 00:17:12

0

我不知道iOS的代碼是對還是錯,但在案件的NodeJS,你應該使用multiparty作爲中間件,可以使用connect-multiparty

var multipart = require('connect-multiparty'); 
var multipartMiddleware = multipart(); 
app.use(require('body-parser').urlencoded({ 
    extended: true 
})) 
app.post("/api/upload", multipartMiddleware, function(req, res){ 
    files = req.files; 
    // Do .... 
}); 
相關問題