1

iOS アプリケーションからコンテンツを受信する node.js サーバーがあります。コンテンツは、1.json と 2.jpeg の 2 つの部分に分かれています。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 の 16 進ダンプは間違っています。

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

問題は次の 2 つの領域のいずれかにあると思います。

  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];
4

1 に答える 1

0

Express jsを使用できます...

正しいエンコーディング ルールで送信し、req.files を介してノード js (エクスプレス ライブラリ経由) 経由でアクセスします。これは私にとってかなり信頼できるものでした。

于 2013-02-08T02:47:31.597 に答える