Javascript 使用ASP.net Core中的标记帮助程序将图像上载为b64字符串

Javascript 使用ASP.net Core中的标记帮助程序将图像上载为b64字符串,javascript,asp.net-core,asp.net-core-mvc,base64,tag-helpers,Javascript,Asp.net Core,Asp.net Core Mvc,Base64,Tag Helpers,嗨,伙计们,我需要在表单中的其他填充值中发送一个编码为b64字符串的图像 我知道我可以做一个Ajax-post,但是有没有办法使用标记帮助器来做同样的事情呢 表格如下: <form class="form-padding" method="post"> <a href="#"><img src=".." id="image"></a> <input type="file" class="form-control" asp-for="I

嗨,伙计们,我需要在表单中的其他填充值中发送一个编码为b64字符串的图像

我知道我可以做一个Ajax-post,但是有没有办法使用标记帮助器来做同样的事情呢

表格如下:

<form class="form-padding" method="post">
  <a href="#"><img src=".." id="image"></a>
  <input type="file" class="form-control" asp-for="ImageUrl" id="dp-upload" onchange="readURL(this);">
       <label asp-for="FirstName"></label>
       <input asp-for="FirstName" />
       <label asp-for="LastName"></label>
       <input asp-for="LastName" />
       <label asp-for="Address">Address</label>
       <input asp-for="Address"  />
      <button type="submit">Add </button>
</form>
<script>
          function readURL(input) {
        if (input.files && input.files[0]) {
            var reader = new FileReader();
            reader.onload = function (e) {
                $('#image').attr('src', e.target.result);
                $('#dp-upload').attr('val', e.target.result);
                debugger
            }
            reader.readAsDataURL(input.files[0]);
        }
    }

<script>

地址
添加
函数readURL(输入){
if(input.files&&input.files[0]){
var reader=new FileReader();
reader.onload=函数(e){
$('#image').attr('src',e.target.result);
$('dp upload').attr('val',e.target.result);
调试器
}
reader.readAsDataURL(input.files[0]);
}
}
我试图找出是否有一种方法可以使用标记帮助器,将图像作为base 64编码字符串发送

我还尝试获取上传文件的完整路径,以便在控制器中将其转换为base 64字符串

但是,我得到的只是图像名称

所需方向:)


谢谢

不。这是不可能的,也不清楚你为什么要这么做。假设这是一个传统的HTML表单post,您需要将upload字段绑定到
ifformfile
类型的属性。然后,您可以访问流,如果愿意,您可以在以下事实发生后将其转换为Base64:

using (var ms = new MemoryStream())
using (var fs = model.ImageUpload.OpenReadStream())
{
    await fs.CopyToAsync(ms);
    model.ImageUrl = $"data:{model.ImageUpload.ContentType};base64,{Convert.ToBase64String(ms.ToArray())}";
}
无论如何,您应该避免使用数据URI,尤其是对于用户上传文件。数据URI有两个问题会显著影响页面性能:

  • 它们与HTML内容一起内联交付,这意味着下载页面需要更长的时间,浏览器解析和呈现页面需要更长的时间。假设您的HTML文档是1KB,您有一个50KB的图像。作为数据URI,浏览器一次下载所有51KB,并且只能在完成后开始渲染。作为一个普通的URL,浏览器下载1KB的文档并立即开始渲染,最后到达时填充图像。以这种方式在页面上包含的图像越多,这种情况就越严重。对于一个图像密集的网站,你可以很容易地在浏览器做任何事情之前强制下载数兆字节的内容

  • Base64是一种非常低效的编码。它可以使图像大小膨胀150%或更大。因此,如果您的图像为50KB,则Base64编码版本的图像可能为75KB。同样,你做得越多,你给页面增加的权重就越大。而且,再加上上面的第1点,你正在激怒一个已经很严重的问题


  • 数据URI最好用于非常小的简单图像,如图标或其他东西。当你开始将它们用于照片之类的东西时,你会遇到很大的问题。您允许用户上传的事实意味着您甚至无法完全控制数据URI的大小,除非您将上传大小限制在极小的范围内。默认情况下,用户最多可以上载2MB文件。这可能意味着您在HTML文档中发送了3MB或更多的内联数据,坦白说,这简直是疯了。当然,您可以调整或压缩用户上传的图像,使其变小,但您需要记住这样做。

    不。这是不可能的,而且您不清楚为什么要这样做。假设这是一个传统的HTML表单post,您需要将upload字段绑定到
    ifformfile
    类型的属性。然后,您可以访问流,如果愿意,您可以在以下事实发生后将其转换为Base64:

    using (var ms = new MemoryStream())
    using (var fs = model.ImageUpload.OpenReadStream())
    {
        await fs.CopyToAsync(ms);
        model.ImageUrl = $"data:{model.ImageUpload.ContentType};base64,{Convert.ToBase64String(ms.ToArray())}";
    }
    
    无论如何,您应该避免使用数据URI,尤其是对于用户上传文件。数据URI有两个问题会显著影响页面性能:

  • 它们与HTML内容一起内联交付,这意味着下载页面需要更长的时间,浏览器解析和呈现页面需要更长的时间。假设您的HTML文档是1KB,您有一个50KB的图像。作为数据URI,浏览器一次下载所有51KB,并且只能在完成后开始渲染。作为一个普通的URL,浏览器下载1KB的文档并立即开始渲染,最后到达时填充图像。以这种方式在页面上包含的图像越多,这种情况就越严重。对于一个图像密集的网站,你可以很容易地在浏览器做任何事情之前强制下载数兆字节的内容

  • Base64是一种非常低效的编码。它可以使图像大小膨胀150%或更大。因此,如果您的图像为50KB,则Base64编码版本的图像可能为75KB。同样,你做得越多,你给页面增加的权重就越大。而且,再加上上面的第1点,你正在激怒一个已经很严重的问题

  • 数据URI最好用于非常小的简单图像,如图标或其他东西。当你开始将它们用于照片之类的东西时,你会遇到很大的问题。您允许用户上传的事实意味着您甚至无法完全控制数据URI的大小,除非您将上传大小限制在极小的范围内。默认情况下,用户最多可以上载2MB文件。这可能意味着您在HTML文档中发送了3MB或更多的内联数据,坦白说,这简直是疯了。当然,您可以调整或压缩用户上传的图像,使其变小,但您需要记住这样做