Node.js使用express在HTTP POST上以多部分/表单数据格式写入jpeg文件

Node.js使用express在HTTP POST上以多部分/表单数据格式写入jpeg文件,node.js,encoding,http-headers,url-encoding,Node.js,Encoding,Http Headers,Url Encoding,我有一个node.js服务器,它正在从iOS应用程序接收内容。内容分为两部分: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 4

我有一个node.js服务器,它正在从iOS应用程序接收内容。内容分为两部分: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代理输出。因此,它是从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的hextump是错误的:

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

我认为问题在于以下两个方面之一:

  • Connect是如何解析http正文的jpeg部分并将其交还给my server.js的。i、 例如,我提供了错误的内容类型或其他标题信息

  • 如何将req.body.imagedata写入jpg文件。i、 例如,我的编码和相关逻辑不正确

  • 你有什么办法让它发挥作用吗?我被卡住了

    [已编辑]

    以下是构造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];
    

    你可以使用ExpressJS


    使用正确的编码规则提交,然后通过req.files通过节点js(通过express库)访问,这对我来说非常可靠

    对不起。我把它放在标题里,但忘了在帖子里写上我在用express。不幸的是,对于多部分/表单数据(一部分是image/jpeg,另一部分是json),Express将图像作为字段而不是文件返回。因此,我从express js收到了2个字段。json看起来正确,但jpeg图像不正确。您是否能够成功地将express与multipart一起使用?以下是我当前的操作方式:enctype=“multipart/form data”(作为表单enctype)fs.readFile(req.files.photo_image.path,function(err,data){var newPath=\u dirname+“filename”;fs.writeFile(newPath,data,function(err){…您应该能够使用req.files.imagedata写入文件,但是(而不是从磁盘读取数据)您可以发布一些您提交文件的应用程序代码吗?(这样我们可以检查您是否以正确的格式发送)。事实上,图像数据是正文的一部分似乎是错误的…谢谢。我不知道enctype。因此,我将其添加到消息的格式中,但imagedata仍然出现在req.body.imagedata中。当我尝试写入req.files.imagedata时,它只会将“未定义”写入文件。我同意这是我构建iOS环境中的消息。我在整个强大的代码中都有console.log语句,但仍然无法理解它!我将在上面的iOS应用程序中添加我正在使用的代码。感谢您的帮助。好的,与web上的其他代码示例相比,我看不到您的应用程序代码中有任何问题…我遇到的一件事是简单的e库检查“使用ASIFormDataRequest发送表单POST”部分它看起来像一个很好的库谢谢你的检查。今晚我将安装这个库,看看它如何运行。作为备用,我将发送两个单独的请求,一个用于JSON,一个用于映像。虽然不理想,但它现在可以工作。我稍后会更新。你应该使用
    req.files.imagedata