c# – 无法将流作为参数传递给aspnet.core.NodeServices中的JS
发布时间:2020-12-15 22:46:34 所属栏目:百科 来源:网络整理
导读:我目前处于将“旧的”ASP MVC项目迁移到新的Core MVC(1.1)的情况,从一次突破性改变跨越到下一次.我现在卡在主题“图像处理”,因为System.Web.Helpers.Web Image被删除了.我看了几个可能的解决方案,并喜欢通过 this comment中描述的Microsoft.AspNetCore.Node
我目前处于将“旧的”ASP MVC项目迁移到新的Core MVC(1.1)的情况,从一次突破性改变跨越到下一次.我现在卡在主题“图像处理”,因为System.Web.Helpers.Web
Image被删除了.我看了几个可能的解决方案,并喜欢通过
this comment中描述的Microsoft.AspNetCore.NodeServices提出的方法.
使用示例脚本并传入文件名时,一切正常.我现在花了几个小时尝试同样的事情来传递一个字节流,因为我从DB读取图像数据并希望直接将它传递给JS. 使用JIMP库的JS: var jimp = require("jimp"); module.exports = function (result,source,mimeType,maxWidth,maxHeight) { // Invoke the 'jimp' NPM module,and have it pipe the resulting image data back to .NET jimp.read(source.buffer).then(function (file) { var width = maxWidth || jimp.AUTO; var height = maxHeight || jimp.AUTO; file.resize(maxWidth,height) .getBuffer(mimeType,function (err,buffer) { var stream = result.stream; stream.write(buffer); stream.end(); }); }).catch(function (err) { console.error(err); }); }; 我的图像控制器上的操作 var imageStream = await _nodeServices.InvokeAsync<Stream>( "Node/resizeImageBuffer",bild.BildDaten.Daten,// byte[] bild.Mimetype,// "image/jpeg" targetsize,// e.g. 400 targetsize); 当我这样调用它时,我的byte []被序列化为字符串,并且不能作为节点中的缓冲区. 当我尝试换入流时,JS甚至没有执行,因为它在序列化参数时中断.像这样: var imageStream = await _nodeServices.InvokeAsync<Stream>( "Node/resizeImageBuffer",new MemoryStream(bild.BildDaten.Daten),// MemoryStream bild.Mimetype,// "image/jpeg" targetsize,// e.g. 400 targetsize); 它抛出 JsonSerializationException: Error getting value from 'ReadTimeout' on 'System.IO.FileStream'. 我做什么net get,从Node到C#的结果流工作并且是一个有效的System.IO.Stream对象,但同样不能作为输出参数… 解决方法
我最终做的是使用System.BitConverter.ToString()将图像byte []转换为其十六进制字符串表示并将其传递给节点脚本.
var byteString = System.BitConverter.ToString(image.Bytes); var img = await _nodeServices.InvokeAsync<Stream>( "./NodeServices/thumbnail","image/jpeg",byteString,width,height ); 然后在节点脚本中,我将十六进制字符串解析回一个字节数组,用它创建一个缓冲区,然后能够将缓冲区传递给jimp. const jimp = require('jimp') module.exports = function (result,bytes,maxHeight) { const parsedBytes = bytes.split('-').map(e => parseInt(`0x${e}`)) const buffer = Buffer.from(parsedBytes) jimp.read(buffer) .then((img) => { var width = maxWidth || jimp.AUTO var height = maxHeight || jimp.AUTO img.resize(width,height) .getBuffer(mimeType,buffer) { const stream = result.stream stream.write(buffer) stream.end() }) }) .catch(err => { console.error(err) }) } 我希望找到一种方法将byte []数组本身传递给节点脚本,但是现在我很高兴这很有效. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |