当前位置: 首页 > 面试题库 >

在Node.js中通过HTTP发送大图像数据

荆城
2023-03-14
问题内容

在我的开发环境中,我有两个服务器。一个通过POSThttp请求将图像发送给另一个。

客户端服务器执行以下操作:

    fs.readFile(rawFile.path,'binary',function (err, file){
        restler.post("http://0.0.0.0:5000",{
            data: file,
            headers:{
                "Content-Type": rawFile.type,
            }
        }).on('complete',function(data,response){                               
            console.log(data);
            res.send("file went through")
        })

收到请求的服务器执行以下操作:

    server.post('/',function(req,res,next){
        fs.writeFileSync("test.png",req.body,"binary",function(err){
            if(err) throw err;
            res.send("OK")
        })
    })

如果我发送小图像,则效果很好。但是,如果我发送了较大的图像,尽管文件保存正确,则仅显示图像的第一上部。其余为黑色。图像尺寸正确。

我想这只是文件中写入的图像的第一块。我尝试创建一个readStream和一个,writeStream但似乎不起作用:

req.body.pipe(fs.createWriteStream('test.png'))

我可以直接从二进制数据流传输pipe到文件吗?对于我所看到的,readStream通常用于从文件而不是原始二进制数据流。

我读了一些帖子,但似乎对我不起作用。

restler在客户端服务器和restify其他服务器中使用模块。

谢谢!


问题答案:

抱歉,直言不讳,但这里有很多错误。

readFile在调用回调之前,将文件的
全部内容 读取到内存中,此时您开始上载文件。

这很不好-特别是在处理图像之类的大文件时-因为实际上没有理由将文件读入内存。这很浪费;在负载下,您会发现服务器的内存不足并崩溃。

相反,您想获得一个 stream
,当从磁盘读取数据时会发出大块数据。您要做的就是将这些块传递到您的上传流(pipe),然后从内存中丢弃数据。这样,您永远不会使用过多的缓冲存储器。

(可读流的默认行为是处理原始二进制数据;仅当您传递时encoding,它才以文本进行处理。)

该请求模块使得该特别容易:

fs.createReadStream('test.png').pipe(request.post('http://0.0.0.0:5000/'));

在服务器上,您遇到了更大的问题。 切勿使用*Sync方法 它将阻止您的服务器执行 任何操作
(例如响应其他请求),直到将整个文件刷新到磁盘为止,这可能需要几秒钟的时间。

因此,我们要获取传入的数据流并将其通过管道传输到文件系统流。您本来是在正确的轨道上;没用的原因req.body.pipe(fs.createWriteStream('test.png'))是因为body它不是流。

bodybodyParser中间件生成。在Restify中,该中间件的行为很像readFile,它在内存中缓冲了整个传入的请求实体。在这种情况下,我们不想要那样。禁用主体解析器中间件。

那么传入数据流在哪里?它是req对象本身。restify的Request继承节点的http.IncomingMessage,这是可读流。所以:

fs.createWriteStream('test.png').pipe(req);

我还应该提到,所有这些工作之所以如此简单,是因为不涉及任何形式的解析开销。请求仅发送没有multipart/form-data包装的文件:

POST / HTTP/1.1
host: localhost:5000
content-type: application/octet-stream
Connection: keep-alive
Transfer-Encoding: chunked

<image data>...

这意味着浏览器无法将文件发布到该URL。如果需要,请查看formidable,它可以对请求实体进行流解析。



 类似资料:
  • 问题内容: 我正在尝试将HTTP POST发送到网络上的设备。不幸的是,我想将四个特定字节的数据发送到设备,但我似乎只能将字符串发送到设备。反正有使用JavaScript发送原始二进制文件吗? 这是我用来执行POST的脚本,除非我在数据字段中输入字符串,否则它目前不会运行。有任何想法吗? 问题答案: 默认情况下,jQuery序列化数据(传递的属性)-这意味着将 数字 作为“ 4244668417”

  • 我是一名服务器端开发人员,学习vanilla JS的诀窍。我需要澄清我的概念,即为我在JS中创建的图像对象发送Ajax POST请求——这个问题与此有关。 想象一下一个网络应用,用户上传照片供他人查看。在上传每个图像时,我使用vanilla JS确认图像的mime类型(通过解释幻数),然后调整图像大小以达到优化目的。 调整大小后,我会: 返回的图像对象必须通过Ajax请求发送到后端。比如: 然而,

  • 问题内容: 我正在尝试使用node.js将http请求发送到neo4j数据库。这是我正在使用的代码: 我检查数据库是否正在运行(我已连接到管理网页,并且一切正常。)恐怕问题不在数据库方面,而在node.js方面。 我希望有人可以对此问题有所启发。我想学习如何在node.js中发送http请求,答案不必特定于neo4j问题。 提前致谢 问题答案: 如果是简单的GET请求,则应使用 否则,需要关闭。

  • 问题内容: 我真的很困惑如何通过套接字发送图像数据类型。请帮我。我已经搜寻了如何将Image数据类型转换为char [],但结果为0。 问题答案: 您可以使用以下方法将其转换为(source): 然后,您可以使用ImageIO.write()方法写入结果。

  • 问题内容: 我想使用Http Post将图像从android客户端发送到Django服务器。该图像是从图库中选择的。目前,我正在使用列表值名称对来将必要的数据发送到服务器,并从JSON中接收来自Django的响应。是否可以对图像使用相同的方法(对于JSON响应中嵌入的图像使用URL)? 另外,哪种方法更好:远程访问图像而不从服务器下载图像或将其下载并存储在位图数组中并在本地使用?图像数量很少(<1

  • 问题内容: Java-通过POST方法发送HTTP参数? 问题答案: 在GET请求中,参数作为URL的一部分发送。 在POST请求中,将参数作为请求的正文发送到标头之后。 要使用进行POST,你需要在打开连接后将参数写入连接。 这段代码可以帮助你入门: