如何获取base64 img src并将其插入input.files
How to get base64 img src and insert it into input.files
我有一张 base64 格式的图像。它在我的控制器中用 Convert.ToBase64String(Image)
编码。我的问题是,通过使用 JavaScript,如何将已加载的图像从 img 元素插入到输入元素中,以便我可以在控制器中接收它。我想我需要以某种方式对其进行解码,创建一个新的图像文件,然后将该文件推送到 input.files,但经过多次尝试后我找不到方法。我在javascript方面经验不多,所以如果有人能帮助我,我将不胜感激。
<img id="mainImage" src="data:image;base64,@Model.ImageInBase64">
<input asp-for="Image" id="mainImageInput" style="display:none" type="file" onchange="readURL(this,'mainImage')" accept="image/jpeg, image/png" class="form-control"/>
我的视图模型有这两个属性:
[Required]
public IFormFile Image { get; set; }
public string? ImageInBase64 { get; set; }
为了了解更多上下文,我将所有图像保存在数据库中作为 byte[]。
我不确定我是否理解正确。但是您可以使用
将 Base64 解码回输入
const reader = new FileReader();
reader.onload = (evt) => {
setFile(evt.target.result);
}
reader.readAsDataURL(base64_here'));
您需要将base64图像转换成文件,然后使用DataTransfer
接收文件。您可以像下面这样尝试我的示例代码。
@{
ViewData["Title"] = "Home Page";
}
@model Net5_MVC.Controllers.HomeController.mainImageInput
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
<script>
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, { type: mime });
}
function ConvertClick(base64url) {
var file = dataURLtoFile(base64url, "test.png");
let container = new DataTransfer();
container.items.add(file);
document.querySelector('#mainImageInput').files = container.files;
var newfile = document.querySelector('#mainImageInput').files[0];
}
</script>
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<img id="mainImage" style="width:200px;height:160px" src="@Model.ImageInBase64">
<input asp-for="Image" id="mainImageInput" style="display:none" type="file" accept="image/jpeg, image/png" class="form-control" />
<button onclick="ConvertClick('@Model.ImageInBase64')">Convert</button>
测试结果:
我有一张 base64 格式的图像。它在我的控制器中用 Convert.ToBase64String(Image)
编码。我的问题是,通过使用 JavaScript,如何将已加载的图像从 img 元素插入到输入元素中,以便我可以在控制器中接收它。我想我需要以某种方式对其进行解码,创建一个新的图像文件,然后将该文件推送到 input.files,但经过多次尝试后我找不到方法。我在javascript方面经验不多,所以如果有人能帮助我,我将不胜感激。
<img id="mainImage" src="data:image;base64,@Model.ImageInBase64">
<input asp-for="Image" id="mainImageInput" style="display:none" type="file" onchange="readURL(this,'mainImage')" accept="image/jpeg, image/png" class="form-control"/>
我的视图模型有这两个属性:
[Required]
public IFormFile Image { get; set; }
public string? ImageInBase64 { get; set; }
为了了解更多上下文,我将所有图像保存在数据库中作为 byte[]。
我不确定我是否理解正确。但是您可以使用
将 Base64 解码回输入const reader = new FileReader();
reader.onload = (evt) => {
setFile(evt.target.result);
}
reader.readAsDataURL(base64_here'));
您需要将base64图像转换成文件,然后使用DataTransfer
接收文件。您可以像下面这样尝试我的示例代码。
@{
ViewData["Title"] = "Home Page";
}
@model Net5_MVC.Controllers.HomeController.mainImageInput
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
<script>
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, { type: mime });
}
function ConvertClick(base64url) {
var file = dataURLtoFile(base64url, "test.png");
let container = new DataTransfer();
container.items.add(file);
document.querySelector('#mainImageInput').files = container.files;
var newfile = document.querySelector('#mainImageInput').files[0];
}
</script>
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<img id="mainImage" style="width:200px;height:160px" src="@Model.ImageInBase64">
<input asp-for="Image" id="mainImageInput" style="display:none" type="file" accept="image/jpeg, image/png" class="form-control" />
<button onclick="ConvertClick('@Model.ImageInBase64')">Convert</button>
测试结果: