c# - ASP.NET Core Web API 提交表单包含文件和文本字段错误
问题描述
我正在使用 .NET 5.0.100-preview.8.20417.9、ASP.NET Core 5 Web API、Entity Framework Core 5、SQL Server 2019、Postman v7.32.0。
模型
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace shadow.DTO
{
public partial class TrustedPersonUserDTO
{
public string Fullname { get; set; }
public string AliasName { get; set; }
public string Email { get; set; }
public string PhoneNumber1 { get; set; }
public string PhoneNumber2 { get; set; }
public string PhoneNumber3 { get; set; }
public int? RelationshipId { get; set; }
public string About { get; set; }
public int? AvatarId { get; set; }
public DateTime? Created { get; set; }
public DateTime? Modified { get; set; }
// Id của user.
public string UserId { get; set; }
}
public partial class TrustedPersonUserDTO2
{
public string Fullname { get; set; }
public string AliasName { get; set; }
public string Email { get; set; }
public string PhoneNumber1 { get; set; }
public string PhoneNumber2 { get; set; }
public string PhoneNumber3 { get; set; }
public int? RelationshipId { get; set; }
public string About { get; set; }
public int? AvatarId { get; set; }
public DateTime? Created { get; set; }
public DateTime? Modified { get; set; }
// Id của user.
public string UserId { get; set; }
public IFormFile file { get; set; }
}
}
和控制器
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using shadow.Data;
using shadow.DTO;
using shadow.Models;
using shadow.Services;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace shadow.Controllers
{
[Route("[controller]")]
[ApiController]
public class UserTrustedPersonController : ControllerBase
{
private IUserService _userService;
private IMailService _mailService;
private IConfiguration _configuration;
private ApplicationDbContext _db;
public static IWebHostEnvironment _environment;
public UserTrustedPersonController(IUserService userService, IMailService mailService, IConfiguration configuration, ApplicationDbContext db, IWebHostEnvironment environment)
{
_userService = userService;
_mailService = mailService;
_configuration = configuration;
_db = db;
_environment = environment;
}
/// <summary>
/// Thêm mới người ủy thác kèm Relationship.
/// </summary>
/// <param name="trustedPersonUserDTO"></param>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<ActionResult<TrustedPersonUserDTO>> AddUserTrustedPersons(TrustedPersonUserDTO trustedPersonUserDTO)
{
var item = new TrustedPerson
{
Fullname = trustedPersonUserDTO.Fullname,
About = trustedPersonUserDTO.About,
AliasName = trustedPersonUserDTO.AliasName,
AvatarId = trustedPersonUserDTO.AvatarId,
Created = DateTime.Now,
Email = trustedPersonUserDTO.Email,
PhoneNumber1 = trustedPersonUserDTO.PhoneNumber1,
PhoneNumber2 = trustedPersonUserDTO.PhoneNumber2,
PhoneNumber3 = trustedPersonUserDTO.PhoneNumber3,
RelationshipId = trustedPersonUserDTO.RelationshipId
};
_db.TrustedPeople.Add(item);
await _db.SaveChangesAsync();
UserTrustedPerson userTrustedPerson = new UserTrustedPerson();
userTrustedPerson.UserId = trustedPersonUserDTO.UserId;
userTrustedPerson.TrustedPersonId = item.Id;
_db.UserTrustedPeople.Add(userTrustedPerson);
await _db.SaveChangesAsync();
return Ok(userTrustedPerson);
}
/// <summary>
/// Thêm mới người ủy thác kèm Relationship.
/// </summary>
/// <param name="trustedPersonUserDTO"></param>
/// <returns></returns>
[HttpPost]
[Route("add")]
[Authorize]
public async Task<ActionResult<TrustedPersonUserDTO>> AddUserTrustedPersons2(TrustedPersonUserDTO2 trustedPersonUserDTO)
{
var item = new TrustedPerson
{
Fullname = trustedPersonUserDTO.Fullname,
About = trustedPersonUserDTO.About,
AliasName = trustedPersonUserDTO.AliasName,
AvatarId = trustedPersonUserDTO.AvatarId,
Created = DateTime.Now,
Email = trustedPersonUserDTO.Email,
PhoneNumber1 = trustedPersonUserDTO.PhoneNumber1,
PhoneNumber2 = trustedPersonUserDTO.PhoneNumber2,
PhoneNumber3 = trustedPersonUserDTO.PhoneNumber3,
RelationshipId = trustedPersonUserDTO.RelationshipId
};
_db.TrustedPeople.Add(item);
await _db.SaveChangesAsync();
await WriteFile(trustedPersonUserDTO.file);
UserTrustedPerson userTrustedPerson = new UserTrustedPerson();
userTrustedPerson.UserId = trustedPersonUserDTO.UserId;
userTrustedPerson.TrustedPersonId = item.Id;
_db.UserTrustedPeople.Add(userTrustedPerson);
await _db.SaveChangesAsync();
return Ok(userTrustedPerson);
}
public class FileUploadAPI
{
public IFormFile files { get; set; }
}
[HttpPost]
[Route("upload2")]
[Obsolete]
public async Task<string> Post(FileUploadAPI objFile)
{
try
{
if (objFile.files.Length > 0)
{
if (!Directory.Exists(_environment.WebRootPath + "\\Upload\\"))
{
Directory.CreateDirectory(_environment.WebRootPath + "\\Upload\\");
}
using (FileStream fileStream = System.IO.File.Create(_environment.WebRootPath + "\\Upload\\" + objFile.files.FileName))
{
objFile.files.CopyTo(fileStream);
fileStream.Flush();
return "\\Upload\\" + objFile.files.FileName;
}
}
else
{
return "Failed";
}
}
catch (Exception ex)
{
return ex.Message.ToString();
}
}
// Upload file ảnh.
[HttpPost("upload", Name = "upload")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]
public async Task<IActionResult> UploadFile(IFormFile file, CancellationToken cancellationToken)
{
if (CheckIfExcelFile(file))
{
await WriteFile(file);
}
else
{
return BadRequest(new { message = "Invalid file extension" });
}
return Ok();
}
/// <summary>
/// Method to check if file is excel file
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
private bool CheckIfExcelFile(IFormFile file)
{
var extension = "." + file.FileName.Split('.')[file.FileName.Split('.').Length - 1];
return (extension == ".png" || extension == ".jpg" || extension == ".bmp" || extension == ".gif" || extension == ".tif"); // Change the extension based on your need
}
private async Task<bool> WriteFile(IFormFile file)
{
bool isSaveSuccess = false;
string fileName;
try
{
var extension = "." + file.FileName.Split('.')[file.FileName.Split('.').Length - 1];
fileName = DateTime.Now.Ticks + extension; //Create a new Name for the file due to security reasons.
var pathBuilt = Path.Combine(Directory.GetCurrentDirectory(), "Upload\\files");
if (!Directory.Exists(pathBuilt))
{
Directory.CreateDirectory(pathBuilt);
}
var path = Path.Combine(Directory.GetCurrentDirectory(), "Upload\\files", fileName);
using (var stream = new FileStream(path, FileMode.Create))
{
await file.CopyToAsync(stream);
}
isSaveSuccess = true;
}
catch (Exception e)
{
//log error
}
return isSaveSuccess;
}
}
}
我打电话给 POST
http://localhost:5002/UserTrustedPerson/add
错误
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.13",
"title": "Unsupported Media Type",
"status": 415,
"traceId": "00-a1fc92edfaf6884d8d74e30c21090e87-7acaa91089108e49-00"
}
如何调用 POST RESTful API 有文件和文本字段成功?
解决方案
你可以设置
[DataType(DataType.Upload)] public IFormFile file{ get; set; }
在你的模型
推荐阅读
- java - 如何提高迭代 130 多个项目并将它们上传到 aws s3 的性能
- javascript - 在 Nodejs 上使用 GoDaddy 的私钥
- c - 以下两种实现之间的基本区别是什么?
- openshift - 是否需要 Openshift 内部注册表?
- elasticsearch - Elasticsearch搜索包含值的所有字段?
- .net - 随机获取 BadRequest 调用 EndDialogAsync()
- python - 如何将字符串转换为日期时间?
- c# - 无法将整数文本文件读入整数数组
- javascript - 如何在 Enter 按键上操作列表元素
- collision-detection - 如何获得与 SAT 的碰撞点