2015-02-05 4 views
5

Sono molto nuovo su javascript e nodo js. Sto lavorando al caricamento di un'immagine dalla mia app per iPad per riposare API del nodo js (express js) utilizzando il modulo multiparty.caricare l'immagine dall'app per ip al nodo server js utilizzando multiparty

Ecco il mio codice di caricamento dell'immagine nell'obiettivo 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]; 

I dati del corpo della richiesta vengono stampati su console.

Per ottenere immagini sul lato server, mi riferisco a questo esempio. [https://github.com/strongloop/express/blob/master/examples/multipart/index.js][1]

In questo esempio, stanno creando var form = new multiparty.Form(); nel metodo post. Ma sto inviando l'immagine dall'applicazione non dal browser, quindi non ho alcuna forma in cui sono definiti i tipi di input. Come posso scrivere questa API REST per ottenere l'immagine e altri parametri di stringa?

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

Anche io sto ricevendo req.body vuoto. Grazie in anticipo !! :)

+0

Non riesco a parlare con il file node.js, ma sembra che tu stia aggiungendo un \ r \ n extra subito dopo aver aggiunto 'imgData' e prima dell'ultimo" - (boundary) - " Terminator. La mia comprensione è che vuoi solo uno \ r \ n dopo il carico utile e il prossimo separatore di limiti. – Rob

+0

Grazie, ma non penso che creerà alcun problema :) – jasmine

+0

Ma c'è un problema: stai aggiungendo inutilmente due byte, '0d 0a', alla fine del file. Si scopre che la maggior parte delle routine di immagine ignorerà questi byte extra, ma non è corretto farlo. – Rob

risposta

4

il codice obiettivo è alla ricerca perfetto. È necessario utilizzare il modulo connect-multiparty. Ecco il codice di esempio per salvare il file.

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

Grazie. Sto lavorando su di esso e sono in grado di individuare il file in posizione temp. Grazie ancora!! – jasmine

+0

come si eliminano i file temporanei? @jasmine –

+0

@ChenyaZhang È possibile utilizzare fs.unlink (percorso file temporaneo) – Rahul

0

non so codice di iOS è giusto o sbagliato, ma nel caso in cui nodejs, è necessario utilizzare multiparty come un middleware, è possibile utilizzare 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 .... 
});