- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我目前正处于将一个“旧的”ASP MVC 项目迁移到新的 Core MVC (1.1) 的情况,从一个突破性的变化到下一个。我现在停留在“图像处理”主题上,因为 System.Web.Helpers.WebImage 已被删除。我查看了几种可能的解决方案,并喜欢通过 this comment 中描述的 Microsoft.AspNetCore.NodeServices 提出的方法!
在使用示例脚本并传入文件名时一切正常。我已经花了几个小时来尝试让同样的事情在我从数据库中读取图像数据并希望将其直接通过管道传输到 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);
});
};
图像 Controller 上的 Action
var imageStream = await _nodeServices.InvokeAsync<Stream>(
"Node/resizeImageBuffer",
bild.BildDaten.Daten, // byte[]
bild.Mimetype, // "image/jpeg"
targetsize, // e.g. 400
targetsize);
当我这样调用它时,我的 byte[] 被序列化为字符串并且不能作为 Node 中的缓冲区。
当我尝试在流中包装时,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'.
我所做的是,从 Node 到 C# 的结果流有效并且是一个有效的 System.IO.Stream 对象,但同样不能用作输出参数...也许有人有想法?
最佳答案
我最终做的是使用 System.BitConverter.ToString()
将图像 byte[] 转换为其十六进制字符串表示并将 that 传递给 Node 脚本.
var byteString = System.BitConverter.ToString(image.Bytes);
var img = await _nodeServices.InvokeAsync<Stream>(
"./NodeServices/thumbnail",
"image/jpeg",
byteString,
width,
height
);
然后在 Node 脚本中,我将十六进制字符串解析回字节数组,用它创建一个缓冲区,然后能够将缓冲区传递给 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[] 数组本身传递给 Node 脚本,但现在我很高兴这可行。
关于c# - 无法将流作为参数传递给 aspnet.core.NodeServices 中的 JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45571137/
我正在使用 NodeServices 在 AspNetCore 应用程序中创建 PDF。应用程序在本地计算机上运行良好,但在生产中部署时,在调用 pdf 函数时,出现以下错误: Error: spaw
我刚刚创建了新的 ASP.NET Core Web Application使用预定义的模板,例如“文件 > 新建 > 项目 > Asp.Net Core Web 应用程序”。 我选择.NET Core
我目前正处于将一个“旧的”ASP MVC 项目迁移到新的 Core MVC (1.1) 的情况,从一个突破性的变化到下一个。我现在停留在“图像处理”主题上,因为 System.Web.Helpers.
实际上,我正在尝试从露天的当前任务中获取文件,但找不到任何有关如何获取当前节点的解密。我发现我可以使用以下方法获取我需要的所有子节点引用: List children = nodeService.ge
我习惯在 Windows 上发布 Azure WebApps,但现在我尝试将 ASP.NET Core 3(带有 NodeServices)部署到 Linux WebApp,但收到以下错误消息: In
我习惯在 Windows 上发布 Azure WebApps,但现在我尝试将 ASP.NET Core 3(带有 NodeServices)部署到 Linux WebApp,但收到以下错误消息: In
我在 ASP.Net Core 应用程序中使用 Microsoft.AspNetCore.NodeServices 1.1.1。一切都工作正常,但现在我在一台新计算机上,但出现以下错误: System
我正在尝试使用 Microsoft.AspNetCore.NodeServices 在 Node 服务器上执行一些 javascript,代码如下: JObject result = null; va
标题使用Microsoft.AspNetCore.NodeServices调用JS文件时获取Node调用超时错误 功能影响我开发了使用 NodeServices 的应用程序,并使用以下文章将其部署在
我正在尝试下载字节数组形式的 nodeServices 生成的 pdf 文件。这是我的原始代码: [HttpGet] [Route("[action]/{appId}")] public async
我尝试在 VS Code 中启动我的 SPA 项目(Angular 4 + ASP.NET),但出现错误。此错误是由以下原因引起的: // Add JavaScript services.
我是一名优秀的程序员,十分优秀!