无法将流作为参数传递给aspnet.core.NodeServices中的JS

时间:2017-08-08 14:31:43

标签: c# node.js asp.net-mvc image-processing asp.net-core

我目前正在迁移一个“老人”#34; ASP MVC项目进入新的核心MVC(1.1),从一个突破性的变化跨越到下一个。我现在停留在主题"图像处理",因为System.Web.Helpers.WebImage被删除了。我查看了几个可能的解决方案,并喜欢通过this comment中描述的Microsoft.AspNetCore.NodeServices建议的方法!。

使用示例脚本并传入文件名时,一切正常。我现在花了几个小时来尝试同样的事情,当我从DB读取图像数据并希望直接将它传递给JS时传递字节流。

JS使用JIMP库:

<img src="<?php echo Uri::base(false); ?>/assets/img/project-icons/icon/<?php echo $work->cover_url; ?>" class="img-responsive" alt="..." />

我的图像控制器上的操作

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);
   });
};

当我这样调用它时,我的byte []被序列化为字符串,并且不能作为节点中的缓冲区。

当我尝试包装流时,JS甚至没有被执行,因为它在序列化参数时中断。像这样:

var imageStream = await _nodeServices.InvokeAsync<Stream>(
                "Node/resizeImageBuffer",
                bild.BildDaten.Daten, // byte[]
                bild.Mimetype, // "image/jpeg"
                targetsize, // e.g. 400
                targetsize);

它抛出

var imageStream = await _nodeServices.InvokeAsync<Stream>(
            "Node/resizeImageBuffer",
            new MemoryStream(bild.BildDaten.Daten), // MemoryStream
            bild.Mimetype, // "image/jpeg"
            targetsize, // e.g. 400
            targetsize);

我做什么net get,从Node到C#的结果流工作并且是一个有效的System.IO.Stream对象,但是同样不能作为输出参数... 也许有人有想法?

1 个答案:

答案 0 :(得分:1)

我最终要做的是使用System.BitConverter.ToString()将图像字节[]转换为它的十六进制字符串表示形式,并将 that 传递给节点脚本。

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 []数组本身传递给节点脚本的方法,但就目前而言,我很高兴这种方法可行。