簡體   English   中英

Node.js使用Express在HTTP POST上以多部分/表單數據形式編寫jpeg文件

[英]Node.js writing jpeg file in multipart/form-data form on HTTP POST using express

我有一個從iOS應用程序接收內容的node.js服務器。 內容分為兩部分:1. json和2. jpeg。 我正在嘗試將jpeg寫入文件,然后可以在瀏覽器中將其拉出。 看起來很簡單,但是當我將緩沖區從req.body.imagedata寫入文件時,它是損壞的文件。

這是來自iPhone上的hexdump的jpeg的第一部分

0000000 **ff d8 ff e0 00 10 4a 46 49** 46 00 01 01 00 00 01
0000010 00 01 00 00 ff e1 00 58 45 78 69 66 00 00 4d 4d
0000020 00 2a 00 00 00 08 00 02 01 12 00 03 00 00 00 01

這是iPhone模擬器的Charles Proxy輸出。 因此,它正在正確地從iPhone傳輸。

00000060  69 6e 61 72 79 0d 0a 0d 0a **ff d8 ff e0 00 10 4a**   inary          J
00000070  **46 49** 46 00 01 01 00 00 01 00 01 00 00 ff e1 00   FIF             
00000080  58 45 78 69 66 00 00 4d 4d 00 2a 00 00 00 08 00   XExif  MM *     

這是服務器運行節點上的tcpdump輸出。

0000370 **d8ff e0ff 1000 464a 4649** 0100 0001 0100
0000380 0100 0000 e1ff 5800 7845 6669 0000 4d4d
0000390 2a00 0000 0800 0200 1201 0300 0000 0100

服務器端節點tcpdump顯示了傳給node.js服務器的正確頭信息。

?ò?
?u???????
8?8w
?u??????????%? ??
8?8??L?|?Q??
?u??????????%? O|
8?8??L?POST /screenw/ HTTP/1.1
Host: ec2-103-22-8-3.compute-1.amazonaws.com:4914
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=01947848929231
Cookie: connect.sid=s%3A3i1td3wlRo8dqrFETNTcbUBV.h4EPihMhJTOdlSBmIog3xm3C%2FvTWVyD4eBBw2Fige6o
Accept-Language: en-us
Accept: */*
Content-Length: 37297
Connection: keep-alive
User-Agent: Teachbits/1.0 CFNetwork/609.1.4 Darwin/12.2.0

|?Q??
?u???????%? ??
8?8??L?--01947848929231
Content-Disposition: form-data; name="imagedata"
Content-Transfer-Encoding: binary
....IMAGE DATA HERE.....

但是在node.js端編寫的jpg的十六進制轉儲是錯誤的:

0000000 bfef efbd bdbf bfef efbd bdbf 1000 464a
0000010 4649 0100 0001 0100 0100 0000 bfef efbd
0000020 bdbf 5800 7845 6669 0000 4d4d 2a00 0000

這是接收POST請求並寫入jpeg文件的代碼。

app.post('/screenw/', function (req, res, next) {

    require("fs").writeFile("./http_image_64.jpg", req.body.imagedata, function (err) {
                if (err) throw err;
                console.log('It\'s saved!');
            });

當我在iPhone模擬器和節點服務器上打印緩沖區的大小時,大小不匹配:

iPhone:圖像內容長為32661

node.js req.body.imagedata原始圖像-31679

我認為問題出在以下兩個方面之一:

  1. Connect如何解析http正文的jpeg部分並將其返回給我的server.js。 即,我提供了錯誤的Content-Type或其他標題信息

  2. 我如何將req.body.imagedata寫入jpg文件。 即,我的編碼和相關邏輯不正確。

關於如何使它起作用的任何想法? 我被困住了。

[編輯]

這是構造http請求的Objective-C代碼:

//creating the url request:
tbImgUrl = [NSURL URLWithString:@"screenw/" relativeToURL:[cts web_service]];
NSMutableURLRequest *tbImgReq2 = [NSMutableURLRequest requestWithURL:tbImgUrl];
[tbImgReq2 setHTTPMethod:@"POST"];
NSString *boundary = @"01947848929231";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[tbImgReq2 setValue:contentType forHTTPHeaderField:@"Content-Type"];
[tbImgReq2 setValue:@"multipart/form-data" forHTTPHeaderField:@"enctype"];
NSData *imageData = UIImageJPEGRepresentation([imgVector screenImage], 1.0); // 0.0 - 1.0 l to h

// setting up the body
NSMutableData *body = [NSMutableData data];

// append the photo image
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"imagedata\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n", @"image/jpeg"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Transfer-Encoding: binary\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:imageData];

// append the json data
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"jsondata\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
NSData *reqData = [NSJSONSerialization dataWithJSONObject:sendPayload
                                                  options:0
                                                    error:nil];
[body appendData:[NSData dataWithData:reqData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];


[tbImgReq2 setHTTPBody:body];
tbImgConnection = [[NSURLConnection alloc] initWithRequest:tbImgReq2
                                                  delegate:self
                                          startImmediately:YES];

您可以使用Express JS ...

使用正確的編碼規則提交,然后通過req.files通過節點js(通過快遞庫)進行訪問,它對我來說非常可靠

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM