我有一个从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的hexdump是错误的:
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 raw image - 31679
我认为问题在于以下两个方面之一:
Connect如何解析http主体的jpeg部分并将其交回我的server.js。即,我提供了错误的内容类型或其他标题信息
我如何将req.body.imagedata写入jpg文件。即,我的编码和相关逻辑不正确。
有关如何使其发挥作用的任何想法?我被卡住了。
[EDITED]
以下是构建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];
答案 0 :(得分:0)
你可以使用快递js ......
使用正确的编码规则提交,然后通过req.files通过节点js(通过快速库)访问,它对我来说非常可靠