使用 angular2 将图像上传到 asp.net core

2024-06-23

所以我有 Angular2 的 ASP.NET Core 应用程序。现在我想上传图像,如果我将其上传为 byte[],我就成功了。但后来我无法检查文件是否真的是后端的图像,所以我尝试寻找其他解决方案。我发现了这个关于文件上传的博客:https://devblog.dymel.pl/2016/09/02/upload-file-image-angular2-aspnetcore/ https://devblog.dymel.pl/2016/09/02/upload-file-image-angular2-aspnetcore/但这对我不起作用......

对于文件上传,我使用 angular2 库Angular2 图像上传,所以我的图像上传的 html 部分如下所示:

<image-upload [max]="1" [buttonCaption]="'Browse'" [preview]="false" (change)="onFileChange($event)"></image-upload>
<button (click)="onSaveChanges()" class="btn btn-primary float-left" type="submit">Save</button>

然后我的 angular2 部分看起来像这样:

onFileChange(event: any) {
    this.file = event.target.files[0];

    if (event.target.files && this.file) {
        var reader = new FileReader();

        reader.onload = (event: any) => {
            this.profilePicture = event.target.result;
        }
        reader.readAsDataURL(this.file);
    }
}

onSaveChanges() {
    this.isSaving = true;
    this.country = this.state.user.country;
    this.userService.userChange(this.firstName, this.lastName, this.country, this.file, this.currentPassword, this.newPassword).subscribe(success => {
        this.state.user.profilePicture = this.profilePicture;
        this.state.user.firstName = this.firstName;
        this.state.user.lastName = this.lastName;
        this.isSaving = false;
        this.passwordError = false;
        this.isSuccessful = true;
        this.currentPassword = '';
        this.newPassword = '';
        this.newPasswordRepeat = '';
    }, error => {
        this.isSaving = false;
        this.passwordError = true;
        this.passwordErrorMessage = error._body;
    });
}

我的 angular2 api 调用如下所示:

userChange(firstName: string, lastName: string, country: string, file: File, oldPassword: string, newPassword: string) {
    let input = new FormData();
    input.append("File", file);

    var url = this.baseUrl + "updateUser";

    return this.http.post(url, { FirstName: firstName, LastName: lastName, Country: country, File: input, OldPassword: oldPassword, NewPassword: newPassword });
}

我的 asp.net 核心控制器(请注意,我没有显示控制器的主体,因为它不相关):

[HttpPost]
public async Task<IActionResult> UpdateUser([FromBody]UserChange userChange)
{ 
}

用户更改类:

public class UserChange
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Country { get; set; }

    public IFormFile File { get; set; }

    public string OldPassword { get; set; }

    public string NewPassword { get; set; }
}

问题是,当我提交图像时,我总是将 UserChange 对象设置为 null。当我将图像添加为 byte[] 时,它就像一个魅力问题是什么??为什么即使我传递的文件不为空,我也总是为空?我看到的另一件事是,当我将类型从 IFormFile 更改为 FormFile 时,我的 UserChange 对象不再为 null,但只有对象中的 File 参数抛出此错误

“userChange.File.ContentDisposition”引发了“System.NullReferenceException”类型的异常

UPDATE 1

不知怎的,我设法使用这个答案将文件发送到 asp.net 控制器:使用Asp.Net Core Web API上传文件文件始终为空 https://stackoverflow.com/questions/44097604/file-upload-using-asp-net-core-web-api-file-is-always-null但要做到这一点,我必须创建另一个没有参数的操作,但在我的情况下如何发送文件仍然未知......


我在想做类似的事情时发现了你的帖子,并且也开始使用 angular2-image-upload 库,但决定首先尝试简单的方法。出于我的目的,我只需要 byte[] 图像文件(接下来将尝试添加图像标题和标题的表单字段),并发现 Michael Dymel 在他的博客文章中建议的一些内容非常有用,并使其正常工作。尽管你的方法没能发挥作用,但这对我帮助很大。

我遇到困难的是正确路由的配置,有一段时间,我的文件似乎在角度服务上被正确拾取,但当它到达“上传”控制器时却为空。一旦我检查了上传服务的路径和控制器的 [Route("/api/upload")] 属性中定义的路径是否相同,一切就就绪了,我能够成功上传。与您遇到的问题略有不同,但这对我有用:

我的上传组件方法:

addFile(): void {
    let fi = this.fileInput.nativeElement;
    if (fi.files && fi.files[0]) {
        let fileToUpload = fi.files[0];

        if (fileToUpload) {
            this.uploadService.upload(fileToUpload)
            .subscribe(res => {
                console.log(res);
            });
        }
        else
            console.log("FileToUpload was null or undefined.");
    }
}

调用上传服务:

upload(fileToUpload: any) {
        let input = new FormData();
        input.append("fileForController", fileToUpload);
        return this.http.post("/api/upload", input );
    }

它发布到我的 ImagesController 的“上传”ActionResult,如下所示(我将图像保存到数据库中,因此“路径”变量实际上是多余的)。 “Image”对象只是 Url、Title、ImageFileContent 和 Caption 字段的简单模型:

[HttpPost]
[Route("/api/upload")]
public async Task<IActionResult> Upload(IFormFile fileForController)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    if (fileForController == null) throw new Exception("File is null");
    if (fileForController.Length == 0) throw new Exception("File is empty");

    var theImage = new Image();
    var path = Path.Combine("~\\ClientApp\\app\\assets\\images\\", fileForController.FileName);

    theImage.Url = path + fileForController.FileName;
    theImage.Title = fileForController.Name + "_" + fileForController.FileName;
    theImage.Caption = fileForController.Name + " and then a Surprice Caption";

    using (Stream stream = fileForController.OpenReadStream())
    {
        using (var reader = new BinaryReader(stream))
        {
            var fileContent = reader.ReadBytes((int)fileForController.Length);

            theImage.ImageFileContent = fileContent;
            _context.Images.Add(theImage);

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }
    return Ok(theImage);
}

我的 html 模板字段几乎与 Michael Dymel 的帖子完全相同:

<form action="gallery" name="fileUploadForm" method="post" enctype="multipart/form-data">
    <div class="col-md-6">
        <input #fileInput type="file" title="Choose Image to upload" />
        <button (click)="addFile()" class="btn btn-success">Add</button>
    </div>
</form>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 angular2 将图像上传到 asp.net core 的相关文章

  • 使用索引避免迭代器失效,维护干净的接口

    我创建了一个MemoryManager
  • 运行时两个注册之间的简单注入器基于动态上下文的注入

    我有一个使用 Simple Injector 进行命令处理程序注册的中介应用程序 并且注入和处理程序均已设置并完美运行 class DoWashingCommandHandler IRequestHandler
  • ASP.NET MVC - 如何实现可重用的用户控件并保持DRY?

    第一次发帖 请多多包涵 在 ASP NET MVC 中创建用户控件时 构造代码的最佳方法是什么 以便调用使用用户控件的视图的控制器不必对控件了解太多 我想知道在 ASP NET MVC 中使用用户控件时保持 DRY 的好方法 请注意 此问题
  • C# Visual Studio 动态代码片段

    我正在开发一个 WinForms 项目 每天都会执行一些重复性的任务 所以我认为创建代码片段 https msdn microsoft com en us library ms165394 v vs 110 aspx会帮助我 但它仅适用于固
  • 如何处理作为参数传递到方法中的 Lambda 表达式 - C# .NET 3.5

    我对 Lambda 表达式的了解有点不稳定 虽然我可以编写使用 Lambda 表达式 又名 LINQ 的代码 但我正在尝试编写自己的方法 该方法采用一些 Lambda 表达式类型的参数 背景 我正在尝试编写一个方法 该方法从任何其他对象类型
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • 如何将 QSerialPort 模块添加到 CMake 中?

    我想将 QSerialPort 模块添加到 CMake 中 根据我的理解 我需要将QT 串口添加到 pro中 我只想使用 CMake 所以我尝试编译简单的 CMake 文件 但有错误 QtCore 正在工作 qDebug 可以毫无问题地显示
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 嘲笑会员用户

    我目前正在开发一个 asp net mvc 2 应用程序 它使用默认的 SqlMembershipProvider 进行身份验证 我已经实现了一个控制器方法 通过调用读取当前用户的 ProviderUserKeyMembership Get
  • 如何通过 Excel 互操作对象自动调整列大小?

    下面是我用来将数据加载到 Excel 工作表中的代码 但我希望在加载数据后自动调整列的大小 有谁知道自动调整列大小的最佳方法 using Microsoft Office Interop public class ExportReport
  • 合并大文件的最佳方法是什么?

    我必须合并数千个大文件 每个大约 200MB 我想知道合并这些文件的最佳方法是什么 行将有条件地复制到合并文件中 可以使用 File AppendAllLines 或使用 Stream CopyTo 吗 使用 File AppendAllL
  • 如何进行平衡组捕获?

    假设我有这个文本输入 tes tR R abc aD mnoR xyz 我想提取 ff 输出 R abc R xyz D mnoR xyz R R abc aD mnoR xyz 目前 我只能使用平衡组方法提取组内的内容 如中所示msdn
  • 是否可以在 Eclipse 中为除 Java 之外的 Eclipse 编写插件?

    谁能帮我用c 写一个eclipse插件 weekens 和 celavek 感谢您提供的信息 我正在研究 JNI 并将尝试实现它 celavek 我们必须做什么样的主控 控制 在C 和java接口中处理是否风险更大 我的要求是在 Java
  • MVC 4 中集合和单个值之间内容协商的差异?

    我正在利用新的 MVC4 ApiController 来构建搜索界面 像这样的东西 public IEnumerable
  • 如何使用 JQuery 创建新的 img 标签,并使用 JavaScript 对象中的 src 和 id?

    我从基本意义上了解 JQuery 但对它绝对是新手 并且怀疑这很容易 我在 JSON 响应中获得了图像 src 和 id 转换为对象 因此在 responseObject imgurl 和 responseObject imgid 中获得了
  • 在 C# 中为 ListBox 分配数据源时,如何从 ListBox 中删除所选项目?

    在 C 中为 ListBox 分配数据源时 如何从 ListBox 中删除所选项目 尝试删除时出现错误 设置 DataSource 属性后 无法修改项目集合 但是当我尝试从数据源 数据表 中删除项目时 它会抛出错误 因为 数据行不在当前行集
  • PC 上 XNA 中的信箱和缩放

    有没有一种方法可以让我基本上以 1080p 或 720p 作为默认分辨率来开发 XNA 游戏 然后根据设置的分辨率将游戏中的所有内容缩放到适当的大小 而不必在每个 Sprite 中设置缩放因子Draw 方法 我的想法是 我可以基于 1080
  • Angular2模板参考变量和动态更新

    我最初试图在 Angular2 中设置一个模板引用变量 这样我就可以反转表的排序顺序 而不必进行绑定 但当我单击复选框时 我没有得到界面的动态更新 我创建了一个简单的 plunker 以防应用程序中的其他内容可能会扰乱代码 并且我看不到正在

随机推荐

  • Pydub from_mp3 给出 [Errno 2] 没有这样的文件或目录

    我发现自己站在墙前 只是尝试将音频文件加载到 pydub 中进行转换 但不断抛出 Errno 2 没有这样的文件或目录 错误 当然 我花了太多时间来确保路径有效 尝试了相对路径和绝对路径 并确认 python 方法 open 可以在完全相同
  • CSS-hack - 在网站正文中添加 css

    我陷入了只能访问网站正文而不能访问网站头部的情况 我必须使用新的样式表 现在我遇到了在网站正文中添加 CSS 文件的解决方案 当然 这是一个黑客 所以我想知道是否有更好的解决方案 我们有不同的方法来加载 CSS 文件 1 HTML 在页面上
  • iPhone VS ipad开发流程(异同)

    我是 iOS 开发新手 我正在努力弄清楚这些事情 iPhone 和 iPad 上的项目 两者有哪些相同之处 编码 图形或 UI 应用程序的设计模式相同还是不同 等待答复 谢谢 就我个人而言 我发现 iPhone 和 iPad 之间唯一真正的
  • 如何在oracle 11g SQL中计算两个日期之间的差异

    当我尝试使用 datediff 函数计算日期差时 它显示该无效标识符 SELECT DATEDIFF day 2008 08 05 2008 06 05 AS DiffDate from da static trade Error inva
  • 如何使用后期绑定访问 Microsoft Word 现有实例

    我正在用 C 开发一些代码 我将在其中与 Microsoft Word 进行交互 我希望能够选择重新使用现有实例或作为创建新实例的替代方案 请记住 我想使用 LATE BINDING 来完成所有这些 可以肯定地说 我已经弄清楚如何在创建新实
  • 我可以像在 C++ 中那样在 R 中拥有多个独立的随机数生成器吗?

    我有许多独立的随机过程 比如到达过程 需要我生成随机数 我想对每个进程使用通用随机数 以便在控制这些策略时比较不同策略的执行情况 我希望进程 A 由生成器 A 控制 使用种子 A 我希望进程 B 由生成器 B 控制 使用种子 B 等等 这可
  • ASP.NET Core 中的 HttpRequest.Path 和 HttpRequest.PathBase 有什么区别?

    详细信息如下 https learn microsoft com en us dotnet api microsoft aspnetcore http httprequest view aspnetcore 3 0 https learn
  • 如何检测IIS Express版本?

    我发现我们的 ASP NET 应用程序在 IIS Express 中的不同计算机上运行方式不同 全部都有 VS 2012 Net 4 5 和集成模式 但有些有 VS 2012 Update 1 有些则没有 如何找到 IIS Express
  • 查找一个字段大于另一字段的行

    我的 SQL 有点生疏了 我无法找到一种方法来检索一个值大于另一个值的行 例如 我有以下行 ROWID 1 CreatedAt 2013 08 03 10 10 23 344 UpdatedAt 2013 08 03 11 10 23 34
  • 对 ArangoDB 文档集合进行重复数据删除

    我确信有一种简单快捷的方法可以做到这一点 但它却让我无法理解 我有一个包含一些重复记录的大型数据集 我想删除重复项 重复项由一个属性唯一标识 但文档的其余部分也应该相同 我尝试以几种不同的方式创建一个仅具有唯一值的新集合 但它们都非常慢 例
  • 自动接受安装 NPX 包 [重复]

    这个问题在这里已经有答案了 运行 NPM 包时npx第一次会出现提示询问是否要下载包 例如 如果您运行命令npx some npm package 您会收到以下提示 Need to install the following package
  • 在 Chrome 扩展内容脚本中共享内存中对象?

    我对 JavaScript 和 Chrome 开发都很陌生 正在尝试创建一个在某些网页中注入内容 CSS 的扩展 很简单 但问题是这样做需要查看本地存储中的大量数据 根据我到目前为止所读到的内容 正确的方法是 读取所需数据 JSON 序列化
  • 无法使用 Rust 在 VSCode-LLDB 中创建条件断点

    我正在使用 LLDB 在 VS Code 中调试 Rust 程序 The 表达式文档 https github com vadimcn vscode lldb blob master MANUAL md expressions说有一个程序变
  • 联合类型上不存在 Typescript 属性

    这是我遇到过几次的情况 看起来应该相当简单 但我找不到不将类型设置为任何的解决方案 函数采用两个不同对象之一作为参数 检查已接收到哪个对象 并返回相应的字段 这是问题的简化版本 但问题是这两个对象只能通过它们的属性 没有重叠 来区分 并且我
  • 使用自动布局指定 UICollectionView 中单元格的一维

    在 iOS 8 中UICollectionViewFlowLayout支持根据单元格自身的内容大小自动调整单元格大小 这会根据单元格的内容调整单元格的宽度和高度 是否可以为所有单元格的宽度 或高度 指定固定值并允许调整其他尺寸的大小 举一个
  • Python 找不到 Brownie 文件

    我正在关注 Solidity 和 Python 教程 仅供参考 我正处于已安装 Python 和 Brownie 并通过 VSCode 运行的阶段 但在询问 Brownie 的版本时收到以下通知 brownie version INFO C
  • 如何迁移到新的 SwiftUI 应用协议?

    我正在开发一个 SwiftUI 应用程序 该应用程序仍然具有场景 应用程序委托文件 并希望将其迁移到新的 SwiftUI 应用程序协议 这只是删除场景 应用程序委托文件 然后将我的 ContentView 在我的例子中为初始视图 添加到 m
  • 如何在 Visual Studio Code 中调试之前自动运行构建任务?

    在 VS Code 中 我必须先运行构建任务 然后开始调试 而在 CLion 中 我只需单击 调试 然后它会在必要时自动构建并开始调试 有没有办法在 VS Code 中自动执行此操作 将构建任务添加到 Launch Json 您正在寻找的可
  • C# 到 Java TripleDES ,不同的结果

    我正在尝试将此 C 加密算法转换为 Java 但是 我不断检索略有不同的加密结果 尚未尝试解密 还需要指出的是 我无法更改 C 代码 但是 当我在 C 中对字符串 test 调用加密函数时 它将返回nmj8MjjO52y928Syqf0J
  • 使用 angular2 将图像上传到 asp.net core

    所以我有 Angular2 的 ASP NET Core 应用程序 现在我想上传图像 如果我将其上传为 byte 我就成功了 但后来我无法检查文件是否真的是后端的图像 所以我尝试寻找其他解决方案 我发现了这个关于文件上传的博客 https