如何使用C# WebAPI .net core 5.0从Reactjs上传多个图像

dpiehjr4  于 2023-01-17  发布在  React
关注(0)|答案(1)|浏览(115)

我是Reactjs的新手,我尝试从Reactjs组件上传多个图像,并在后端使用C# Web API,但每次我在Web API操作方法中获得Request.Form.Files计数=0时,我都能够上传图像;e图像,但现在尝试与多个和面临的问题,下面是组件代码:

import Header from './Header'
import { Button } from 'react-bootstrap'
import { useEffect, useState } from 'react';

function Add() {

    const [productName, setProductName] = useState("");
    const [productCode, setProductCode] = useState("");
    const [productPrice, setProductPrice] = useState("");
    const [productDescription, setProductDescription] = useState("");
    const [productImage, setProductImage] = useState([]);

    // useEffect(()=>{

    //     AddProduct();

        
    // },[] )

    async function AddProduct() {

       // let data={productName, productCode, productPrice, productDescription}

        const formData = new FormData();
        for(let i=0;i<productImage.length;i++){
            // console.log(productImage)
            formData.append("productImage"+i, productImage);
       }
        // formData.append("productImage", productImage);
        formData.append("productName", productName);
        formData.append("productCode", productCode);
        formData.append("productPrice", productPrice);
        formData.append("productDescription", productDescription);
        formData.append("userName",localStorage.getItem("UserName"));

        console.warn("Sonu ", formData)
        console.log(productImage)

        let result = await fetch("https://localhost:44353/ApiProduct/AddProduct", {
            method: "POST",
            headers: {},
            body: formData,
        })
        let response=await result.json();
        if(response.status)
        {
            alert (response.successMessage)
        }
        else{
            alert (response.errorMessage)

        }

    }
    function onImageChange(e) {
        setProductImage([...e.target.files]);
      }
        return (

            <div>
                <Header />
                <h1>Add Product</h1>
                <div className='col-6 offset-3' >
                    <input type="text" placeholder='productName'  className='form-control' onChange={(e) => setProductName(e.target.value)} /><br /><br />
                    <input type="text" placeholder='productCode'  className='form-control' onChange={(e) => setProductCode(e.target.value)} /><br /><br />
                    <input type="text" placeholder='productPrice'  className='form-control' onChange={(e) => setProductPrice(e.target.value)} /><br /><br />
                    <input type="text" placeholder='productDescription'  className='form-control' onChange={(e) => setProductDescription(e.target.value)} /><br /><br />
                    <input type="file"  multiple accept=".jpg"  className='form-control' onChange={(e) => onImageChange(e)} /><br /><br />
                    

                    <Button onClick={AddProduct}>Add Products</Button>
                </div>
            </div>

        );
    }

    export default Add;

以下是API代码。

public ResponseData AddProduct([FromForm] IList<IFormFile> files)
                        {
            ProductModel productModel = new ProductModel();
            if(files?.Any())
            {
            // Each time in my case files count is showing zero.
            }
            else
            {
            // other Logic
            }
            }
cfh9epnr

cfh9epnr1#

我在后端使用了C#WebAPI,但是每次我在WEBAPI动作方法中得到Request.Form.Files计数= 0时,我都能够上传歌曲;e图像,但现在尝试与多个和面临的问题。
首先,当你发送请求到API控制器时,你应该匹配与你的控制器相同的参数名和你的fromData提交参数。在你的例子中,你的控制器参数名是files,但是,你绑定了你的formData参数为formData.append("productImage"+i, productImage);,这是不正确的,导致提交时数据丢失。
另外,不确定你说的public ResponseData AddProduct API控制器名称是什么意思。此外,这里是如何将图像列表从响应请求发送到www.example.com核心API控制器的完整示例。Asp.net core API controller.
来自React中的数据绑定:

async function AddProduct(productImage) {

            var form = new FormData();
            if (productImage.length > 0) {
             
                for (var i = 0; i < productImage.length; i++) {
                    var image = productImage[i];
                    form.append('files', image);
                }
               
            }

            let result = await fetch("https://localhost:44353/ApiProduct/AddProduct", {
                method: "POST",
                headers: {},
                body: form,
            });
            console.log(result.status);

        }
    • 注:**此处确认AddProduct(productImage)productImage是我在选择图像时传递的每个图像,您需要在此处传递参数。此外,此处form.append('files', files);文件是您的控制器参数,必须相应匹配。

控制器:

[HttpPost]
        public async Task<IActionResult> AddProduct([FromForm] List<IFormFile> files)
        {
            return Ok(files);
        }

输出:

相关问题