2015-02-05 9 views
5

का उपयोग करके आईपैड ऐप से नोड जेएस सर्वर पर अपलोड छवि अपलोड करें मैं जावास्क्रिप्ट और नोड जेएस के लिए बहुत नया हूं। मैं मल्टीपार्टी मॉड्यूल का उपयोग करके नोड जेएस (एक्सप्रेस जेएस) के एपीआई को आराम करने के लिए अपने आईपैड ऐप से छवि अपलोड करने पर काम कर रहा हूं।मल्टीपार्टी

यहां मेरी छवि अपलोड कोड उद्देश्य सी में है।

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() बना रहे हैं; पोस्ट विधि में। लेकिन मैं ब्राउज़र से नहीं एप्लिकेशन से छवि भेज रहा हूं इसलिए मेरे पास कोई ऐसा फॉर्म नहीं है जिसमें इनपुट प्रकार परिभाषित किए गए हों। छवि और अन्य स्ट्रिंग पैरामीटर प्राप्त करने के लिए मैं यह 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); 
}); 

इसके अलावा मुझे रिक्त स्थान मिल रहा है। अग्रिम में धन्यवाद !! :)

+0

मैं node.js सामान से बात नहीं कर सकता, लेकिन आप 'imgData' जोड़ने के बाद और अंतिम" - (सीमा) - "के बाद एक अतिरिक्त \ r \ n सही जोड़ रहे हैं। टर्मिनेटर। मेरी समझ यह है कि आप पेलोड और अगली सीमा विभाजक के बाद केवल एक \ r \ n चाहते हैं। – Rob

+0

धन्यवाद लेकिन मुझे नहीं लगता कि कोई समस्या पैदा होगी :) – jasmine

+0

लेकिन एक समस्या है: आप अनावश्यक रूप से फ़ाइल के अंत में दो बाइट्स, '0 डी 0 ए' जोड़ रहे हैं। यह पता चला है कि अधिकांश छवि दिनचर्या इन अतिरिक्त बाइटों को अनदेखा कर देगी, लेकिन ऐसा करने के लिए यह गलत है। – Rob

उत्तर

4

अपने उद्देश्य कोड सही लग रही है। आपको कनेक्ट-मल्टीपार्टी मॉड्यूल का उपयोग करने की आवश्यकता है। फ़ाइल को सहेजने के लिए नमूना कोड यहां दिया गया है।

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

+0

आप temp फ़ाइलों को कैसे हटाते हैं? @jasmine –

+0

@ चेनज़हांग आप fs.unlink (temp फ़ाइल पथ) का उपयोग कर सकते हैं – Rahul

0

मैं आईओएस कोड सही है या गलत है पता नहीं है, लेकिन 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 .... 
});