2015-02-05 5 views
5

저는 javascript와 node j가 매우 새롭습니다. multiparty 모듈을 사용하여 노드 js (express js)의 api를 내 iPad 앱에서 업로드하는 중입니다.multiparty를 사용하는 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(); 포스트 방법. 그러나 입력 형식이 정의되어있는 형식이 없으므로 브라우저가 아닌 응용 프로그램에서 이미지를 보내고 있습니다. 이 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'를 추가 한 직후와 마지막 "- (boundary) -"앞에 node를 추가하는 것처럼 보입니다. 터미네이터. 내 이해는 페이로드와 다음 경계 구분 기호 뒤에 하나만 \ r \ n을 원한다는 것입니다. – Rob

+0

고마워요하지만 그 어떤 문제를 만들 것이라고 생각하지 않습니다 :) – jasmine

+0

하지만 문제가 있습니다 : 당신은 불필요하게 2 바이트, '0d 0a', 파일의 끝에 추가하고있어. 대부분의 이미지 루틴은 이러한 여분의 바이트를 무시하지만 그럴 수 없다는 것이 밝혀졌습니다. – Rob

답변

4

사용할 수있는 미들웨어로 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

+0

어떻게 임시 파일을 삭제합니까? @ 재스민 –

+0

@ChenyaZhang 당신은 fs.unlink (임시 파일 경로)를 사용할 수 있습니다. – Rahul

0

내가 아이폰 OS 코드가 오른쪽 또는 잘못 모르겠지만, nodejs 경우에, 당신은 당신이 당신의 목적 코드가 완벽하게 찾고 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 .... 
}); 
관련 문제