繁体   English   中英

Blazor WebAssembly PWA - IFormFile FromForm 始终为 null

[英]Blazor WebAssembly PWA - IFormFile FromForm is always null

我已经设置了一个Blazor WebAssembly ASP.Net Core hosted PWA项目,并在其中使用Azure Cognitive Services 因此,我在我的一个客户端视图中有一个表单,用户可以在其中上传图像,这将被称为 Azure。

在剃刀视图中,我有这个:

@inject HttpClient client;
@inject IFileReaderService FileReader;
@inject NavigationManager navi;

<div class="text-center">
    <input class="btn btn-secondary " name="file" @ref="InpReference" type="file" id="file-selector" placeholder="Brows" accept="image/*" capture="camera" @onclick="InputFile">

    @if (_fileSelected != false)
    {
        <input class="btn btn-primary" type="button" role="button" id="startbutton" @onclick="Upload" value="upload" />
    }
</div>

@code {
        private async Task Upload()
        {
            // content base structure
            MultipartFormDataContent content = new MultipartFormDataContent();
            content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data");
    
            
            foreach (/*IFileReference*/var fileReference in fileReferences)
            {
                Console.WriteLine("test1");
                // getting the file size
                IFileInfo fileinfo = await fileReference.ReadFileInfoAsync();
                Stream fileStream;
                var fileReferencesArray = fileReferences.ToArray();
                using (var fs = await fileReference.CreateMemoryStreamAsync((int)fileinfo.Size))
                {
                    Console.WriteLine("test2");
                    fileStream=new MemoryStream(fs.ToArray());
                }
                Console.WriteLine("test4" + fileinfo.Size);
                StreamContent sc = new StreamContent(fileStream, (int)fileStream.Length);
                content.Add(sc, "file", fileinfo.Name);
                Console.WriteLine("test5");
            }
            Console.WriteLine("test6");
            var response = await client.PostJsonAsync<List<Prediction>>("api/Azure/Prediction", content);
            Console.WriteLine(response.Count + " : " + response.GetType().ToString());
            foreach (var prediction in  response)
            {
                Console.WriteLine(prediction.Id + ":" + prediction.Name + "," + prediction.Probability.ToString());
            }
            navi.NavigateTo("detailView/");
    
    
        }
}

我的 WebApi Controller 用于处理:

    ...
        [HttpPost]
        public List<Prediction> getPrediction([FromForm]IFormFile file)
        {
            if (file == null)
            {
                return new List<Prediction>();
            }
            List<Prediction> predicitions = azure_Client.GetPrediction(file.OpenReadStream());
            return predicitions;
        }
    ...

问题是 controller 中的[FromForm]IFormFile file始终为null 这只是PWA项目中的 null。 我在没有PWA的情况下设置了相同的项目并且它可以工作,它不是null ,它正在从视图中获取选定的图像! 那里有什么区别,为什么HttpClientBlazor WebAssembly ASP.Net Core hosted中的做法不同?

根据我的测试,如果要在 Blazor WebAssembly ASP.Net Core 托管 PWA 中上传文件,请参考以下步骤

  1. 客户端(我使用 sdk Tewr.Blazor.FileReader

    一个。 更新Program.cs

     builder.Services.AddFileReaderService(options => { options.UseWasmSharedBuffer = true; }); builder.Services.AddTransient(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

    湾。 上传文件razor-view

@using System.IO
@using Blazor.FileReader

@inject HttpClient client;
@inject IFileReaderService fileReader
<h1>File uplaod Blzaor WebAssembly!</h1>
<div class="row">
    <div class="col-4">
        <div class="form-group">
            <input type="file" name="image" @ref="inputReference" @onchange="async() =>await OpenFile()" />
            <ul>
                <li>File Name: @fileName</li>
                <li>Size: @size</li>
                <li>Type: @type</li>
            </ul>

        </div>
        <button class="btn btn-block btn-success" @onclick="async() =>await UploadFile()"> Upload File</button>
        @if (!string.IsNullOrWhiteSpace(message))
        {
            <div class="alert alert-success">
                File has been uplaoded
            </div>

        }
    </div>   
</div>


@code{
    ElementReference inputReference;
    string message = string.Empty;
    string fileName = string.Empty;
    string type = string.Empty;
    string size = string.Empty;
    Stream fileStream=null;

    async Task UploadFile()
    {
        var content = new MultipartFormDataContent();
        content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data");
        var sc = new StreamContent(fileStream, (int)fileStream.Length);
        content.Add(sc, "image", fileName);


        var response = await client.PostAsync("/upload", content);
        if (response.IsSuccessStatusCode) {
            message = "OK";
        }

    }

    async Task OpenFile()
    {
        var file = (await fileReader.CreateReference(inputReference).EnumerateFilesAsync()).FirstOrDefault();

        if (file == null) {
            return;
        }

        var fileInfo=await file.ReadFileInfoAsync();
        fileName = fileInfo.Name;
        type = fileInfo.Type;
        size = $"{fileInfo.Size} Bytes";

        using (var ms = await file.CreateMemoryStreamAsync((int)fileInfo.Size)) {
            fileStream = new MemoryStream(ms.ToArray());
        }
    }



}
  1. 服务器

API COntroller

 [HttpPost]
        public async Task<IActionResult> Post([FromForm(Name ="image")]IFormFile file) {

            if (file == null || file.Length == 0) {
                return BadRequest("do not receive file");
            }

            var fileName = file.FileName;
            var extension = Path.GetExtension(fileName);
            var newFileName = $"{Guid.NewGuid()}{extension}";
            var filePath = Path.Combine(_env.ContentRootPath, "Images", newFileName);
            if (!Directory.Exists(Path.Combine(_env.ContentRootPath, "Images"))) {
                Directory.CreateDirectory(Path.Combine(_env.ContentRootPath, "Images"));
            
            }
            using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write)) {
                await file.CopyToAsync(stream);
            }
            
            return Ok(filePath);
        
        }
  1. 结果

在此处输入图像描述 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM