将base64字符串转换后的图像附加到后端以请求表单数据吗?

时间:2019-08-09 05:21:42

标签: c# .net .net-core

所以我有一个base64字符串,该字符串将传递到端点,在端点中需要将其转换为图像,然后将其附加在表单数据中。有可能吗?

现在我有这样的东西

Image img = options.base64String.ToImage();

我希望将图像附加到请求的表单数据中,这样我就可以得到它:

Image img = options.base64String.ToImage();

Request.Form.Files.Add(img); // I want to add the image on something like this

var files = Request.Form.Files;

我想将img附加到Request.Form.Files

还请注意,我只能访问该应用程序的API。

谢谢!

2 个答案:

答案 0 :(得分:1)

当然可以。我有一个解决方案,我也在 ASP.NET Web应用中使用图像。

我将图像以byte[]的形式存储在数据库中,因此为 byte数组,并显示该字节数组中的图像,但是使用{{1} }对象。

例如,我有一个用户模型,存储在数据库中,该用户具有IFormFile属性,还具有另一个模型(ProfilePic)用于更新它。

我的模型到数据库:

ViewModel

我用于显示或更新用户个人资料图片的class UserModel { public byte[] ProfilePic{get;set;} } 如下:

ViewModel

显示页面时,我从数据库填充了个人资料照片数组

public class InputModel
{
    // actual image
    public byte[] ProfilePic { get; set; }

    // image to pass to POST method (so to update)
    public IFormFile ProfilePicToUpdate { get; set; }
}

在这样的页面上显示个人资料照片:

public async Task<IActionResult> OnGetAsync()
{
    var user = await _userManager.GetUserAsync(User);
    if (user == null)
    {
        throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
    }

    Input = new InputModel
    {
        ProfilePic = user.ProfilePic,
        XP = user.XP,
        Address = user.Address,
        BirthDate = user.BirthDate
    };
    return Page();
}

然后在Post方法中处理图像,如下所示:

<form method="post" enctype="multipart/form-data">
    <h4>Profile picture</h4>
    @if (Model.Input.ProfilePic != null)
    {
        <object class="" data="data:image/png;base64,@Convert.ToBase64String(Model.Input.ProfilePic)" width="224" height="224" type="image/png"></object>
    }
    else
    {
        <img class="" src="~/images/profilePicDefault50x50.png" width="224" height="224" />
    }
    <input asp-for="Input.ProfilePicToUpdate" class="form-control" />
    <span asp-validation-for="Input.ProfilePicToUpdate" class="text-danger"></span>
    <button type="submit" class="btn btn-default">Save</button>
</form>

答案 1 :(得分:1)

HttpRequest对象无法修改;在整个请求期间,它是不变的。其中包括HttpRequest.Form.Files

您可以影响请求输入流数据的处理方式。由于输入流包含“表单”字段,因此可能可以使用过滤器来修改请求中的表单数据。但是,它确实有一些警告:

  • 这仅在请求管道的早期非常有效。一旦管道中的任何内容与输入流进行交互(例如,从Form中读取任何内容),您就来不及了。
  • 您正在使用原始数据流。 Form["Hello"]不能在这里工作-您需要研究HTTP表单的编码方式,精确地解析数据并即时重新创建正确的更改后的表单数据。

除非您真的没有其他选择,否则我建议避免这种情况。

一个相对简单的选择是使用实际的请求数据创建一个新的Web请求,并从中返回结果(请确保您发出的请求不会引起另一个请求,否则可能会导致无限循环阻塞您的服务:))。当然,您需要确保所发出的新请求具有所有正确的数据;没有简单的方法可以将HttpRequest变成新的HttpWebRequest