2015-02-05 6 views
5

Ich bin sehr neu zu Javascript und Node js. Ich arbeite daran, Bild von meiner iPad App zu laden, um api von Node js (express js) mit Multiparty-Modul zu ruhen.Bild von ipad app auf Knoten js Server hochladen mit Multiparty

Hier ist mein Bild Upload-Code in Ziel 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]; 

Anfragedaten werden auf Konsole gedruckt.

Um das Bild auf der Serverseite zu bekommen, verweise ich auf dieses Beispiel.

In diesem Beispiel erstellen sie var form = new multiparty.Form(); in Post-Methode. Aber ich sende Bild von der Anwendung nicht vom Browser, so habe ich kein Formular, in dem Eingabearten definiert sind. Wie kann ich diese REST-API schreiben, um das Bild und andere String-Parameter zu erhalten?

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); 
}); 

Auch ich bekomme req.body leer. Vielen Dank im Voraus! :)

+0

Ich kann nicht mit dem node.js Zeug sprechen, aber Sie scheinen ein zusätzliches \ r \ n direkt nach dem Hinzufügen von 'imgData' und vor dem letzten" - (Grenze) - " Terminator. Mein Verständnis ist, dass Sie nur ein \ r \ n nach der Nutzlast und dem nächsten Grenztrennzeichen wollen. – Rob

+0

Danke, aber ich denke nicht, dass das ein Problem verursachen wird :) – jasmine

+0

Aber es gibt ein Problem: Sie fügen unnötigerweise zwei Bytes, '0d 0a', an das Ende der Datei. Es stellt sich heraus, dass die meisten Bildroutinen diese zusätzlichen Bytes ignorieren, aber dies ist nicht korrekt. – Rob

Antwort

4

Ihr Ziel Code verwenden perfekt sucht. Sie müssen das connect-multiparty-Modul verwenden. Hier ist der Beispielcode zum Speichern der Datei.

+0

Danke. Ich arbeite daran, und ich bin in der Lage, die Datei im Temp-Ort zu lokalisieren. Noch einmal vielen Dank!! – jasmine

+0

Wie löschen Sie die temporären Dateien? @jasmine –

+0

@ChenyaZhang Sie können fs.unlink (temporärer Dateipfad) verwenden – Rahul

0

Ich weiß nicht, iOS Code richtig oder falsch ist, aber in NodeJS Fall sollten Sie multiparty als Middleware verwenden, können Sie 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 .... 
});