首页 > 解决方案 > 图片未完全显示在网站上,导致服务器崩溃

问题描述

我在服务器上上传图像然后在现场显示时遇到问题。后端在sailsjs + angular.js 中运行,但我显示图像的模板是预定义的,并且只有js/html。

有两种情况: 1 – 一切正常 2 – 没有正常工作

1)我上传的图片大小为107kb,它完全上传到服务器,应用程序没有关闭,图片显示在网站上

2)我上传的图片大小超过107kb,它上传到服务器已满,应用程序与后端一起重新启动,一半的图片显示在网站上(应用程序崩溃)。

首先,我认为问题出在尺寸上,但是我上传了图像而没有在网站上显示它,并且一切正常。所以问题在于展示它。这是来自此错误的日志。

Error: write after end
at write_ (_http_outgoing.js:627:15)
at ServerResponse.write (_http_outgoing.js:622:10)
at ReadStream.ondata (_stream_readable.js:651:20)
at ReadStream.emit (events.js:180:13)
at ReadStream.emit (domain.js:422:20)
at ReadStream.Readable.read (_stream_readable.js:487:10)
at flow (_stream_readable.js:858:34)
at ServerResponse.<anonymous> (_stream_readable.js:719:7)
at ServerResponse.emit (events.js:180:13)
at ServerResponse.emit (domain.js:422:20)
at Socket.ondrain (internal/http.js:20:44)
at Socket.emit (events.js:185:15)
at Socket.emit (domain.js:422:20)
at onwriteDrain (_stream_writable.js:487:12)
at afterWrite (_stream_writable.js:475:5)
at onwrite (_stream_writable.js:468:7)

此代码用于上传: here

此代码在网站上显示图像:

previewIframe.$('.js-asset img').attr('src', uploadedPath); // tmp path

标签: javascriptnode.jssails.js

解决方案


在处理图像(以及所有非视频)的代码中,您有

fs.createReadStream(path).pipe(res);
res.writeHead(200, { 'Content-Type': contentType });

可以将文件通过管道传输到响应,但您需要先编写 HTTP 标头,然后输入数据:

res.writeHead(200, { 'Content-Type': contentType });
fs.createReadStream(path).pipe(res);

或者,使用更明确的词汇:

res.writeHead(200, { 'Content-Type': contentType });
const stream = fs.createReadStream(path);
stream.on('data', stuff => {
    res.write(stuff);
});
stream.on('end',() => {
    // explicitly close the response
    res.end();
});

推荐阅读