图像未在网站上完全显示并且导致服务器崩溃
Image is not showing on website fully and it crash a server
我在服务器上上传图片然后在网站上显示时遇到问题。后端在 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
可能会出现"templete"部分在上传图片还没有完全上传的情况下就把上传的图片拍了
可能你的代码是异步的,所以当你上传文件时,响应在文件实际写入之前发送。尝试使您的代码与 async/await 同步。
PS: 您分享的link没有任何代码。
只上传文件的一部分听起来很像您需要先刷新流到磁盘,然后再做任何其他事情。也可能你没有先关闭流。
在处理图像(以及所有 non-video)的代码中,您有
fs.createReadStream(path).pipe(res);
res.writeHead(200, { 'Content-Type': contentType });
可以通过管道传输文件以进行响应,但您需要先编写 HTTP header,然后传入数据:
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();
});
我在服务器上上传图片然后在网站上显示时遇到问题。后端在 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
可能会出现"templete"部分在上传图片还没有完全上传的情况下就把上传的图片拍了
可能你的代码是异步的,所以当你上传文件时,响应在文件实际写入之前发送。尝试使您的代码与 async/await 同步。
PS: 您分享的link没有任何代码。
只上传文件的一部分听起来很像您需要先刷新流到磁盘,然后再做任何其他事情。也可能你没有先关闭流。
在处理图像(以及所有 non-video)的代码中,您有
fs.createReadStream(path).pipe(res);
res.writeHead(200, { 'Content-Type': contentType });
可以通过管道传输文件以进行响应,但您需要先编写 HTTP header,然后传入数据:
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();
});