c# – 无法将流作为参数传递给aspnet.core.NodeServices中的JS
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 无法将流作为参数传递给aspnet.core.NodeServices中的JS,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2600字,纯文字阅读大概需要4分钟。
内容图文
![c# – 无法将流作为参数传递给aspnet.core.NodeServices中的JS](/upload/InfoBanner/zyjiaocheng/774/2e2d4a109b9543298cfd8c794335ce4c.jpg)
我目前处于将“旧的”ASP MVC项目迁移到新的Core MVC(1.1)的情况,从一次突破性改变跨越到下一次.我现在卡在主题“图像处理”,因为System.Web.Helpers.WebImage被删除了.我看了几个可能的解决方案,并喜欢通过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, mimeType, bytes, maxWidth, 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, function (err, buffer) {
const stream = result.stream
stream.write(buffer)
stream.end()
})
})
.catch(err => {
console.error(err)
})
}
我希望找到一种方法将byte []数组本身传递给节点脚本,但是现在我很高兴这很有效.
内容总结
以上是互联网集市为您收集整理的c# – 无法将流作为参数传递给aspnet.core.NodeServices中的JS全部内容,希望文章能够帮你解决c# – 无法将流作为参数传递给aspnet.core.NodeServices中的JS所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。