sha*_*wat 16 c# asp.net .net-core asp.net-core
你如何形成你应该从请求中接收一个file和一个text值的动作方法的参数?
我试过这个
public string Post([FromBody]string name, [FromBody]IFormFile imageFile)
Run Code Online (Sandbox Code Playgroud)
并尝试从Postman打它,但它给了我500 Internal Server Error.我也无法调试它,因为它永远不会触及我放置断点的action方法中的第一个语句.
任何想法我们如何解析基于边界的请求并提取文件和其他文本字段?我是ASP.NET Core的新手.
小智 20
对于任何面临相同问题的人来说,这是一个快速解决方案:
您将使用 ajax 发送以下 formData
let formData: FormData;
formData = new FormData();
formData.append('imageFile', imageFile);
formData.append('name', name);
Run Code Online (Sandbox Code Playgroud)
然后你会在你的控制器中收到它,如下所示:
public string Post(IFormCollection data, IFormFile imageFile)
Run Code Online (Sandbox Code Playgroud)
然后您将像往常一样访问数据:
var name = data["name"];
Run Code Online (Sandbox Code Playgroud)
Ye *_*int 18
我有类似的问题,我通过在函数中使用[FromForm]属性和FileUploadModelView解决了问题,如下所示:
[HttpPost]
[Route("upload")]
public async Task<IActionResult> Upload([FromForm] FileUploadViewModel model, [FromForm] string member_code)
{
var file = model.File;
...
}
Run Code Online (Sandbox Code Playgroud)
Nit*_*pra 12
在 HomeController.cs 中
using Microsoft.AspNetCore.Hosting;
.......
private IHostingEnvironment _environment;
public HomeController(IHostingEnvironment environment)
{
_environment = environment;
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Index(IFormCollection formdata)
{
var files = HttpContext.Request.Form.Files;
foreach (var file in files)
{
var uploads = Path.Combine(_environment.WebRootPath, "Images");
if (file.Length > 0)
{
string FileName = Guid.NewGuid(); // Give file name
using (var fileStream = new FileStream(Path.Combine(uploads, FileName), FileMode.Create))
{
file.CopyToAsync(fileStream);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在视图中 - Index.cshtml
<form method="post" enctype="multipart/form-data" >
.....
</form>
Run Code Online (Sandbox Code Playgroud)
你可以试试这个代码。
谢谢!!
我正在使用以下代码来完成此任务,以便解析Mailgun的响应,该响应包含文件和文本值。
请注意,“破折号”就是这样的属性名称,例如“ MessageHeaders”变成了“ message-headers”;显然,您应该使用对您的用例有意义的任何逻辑。
控制器:
using System;
using Microsoft.AspNetCore.Mvc;
using NuGet.Protocol.Core.v3;
namespace Potato
{
[Route("api/[controller]")]
public class MailgunController : Controller
{
[HttpPost]
public IActionResult Post()
{
MailgunEmail email = new MailgunEmail(Request);
return Ok(email.ToJson());
}
}
}
Run Code Online (Sandbox Code Playgroud)
模型:
using System;
using System.Reflection;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
namespace Potato
{
public class MailgunEmail
{
public IEnumerable<IFormFile> Attachments { get; set; }
public string Recipient { get; set; }
public string Sender { get; set; }
public string From { get; set; }
public string Subject { get; set; }
public string BodyPlain { get; set; }
public string StrippedText { get; set; }
public string StrippedSignature { get; set; }
public string BodyHtml { get; set; }
public string StrippedHtml { get; set; }
public int? AttachmentCount { get; set; }
public int Timestamp { get; set; }
public string Token { get; set; }
public string Signature { get; set; }
public string MessageHeaders { get; set; }
public string ContentIdMap { get; set; }
public MailgunEmail(HttpRequest request)
{
var form = request.Form;
Attachments = new List<IFormFile>(form.Files);
foreach (var prop in typeof(MailgunEmail).GetProperties()) {
string propName = Dashify(prop.Name);
var curVal = form[propName];
if (curVal.Count > 0) {
prop.SetValue(this, To(curVal[0], prop.PropertyType), null);
}
}
}
private object To(IConvertible obj, Type t)
{
Type u = Nullable.GetUnderlyingType(t);
if (u != null) {
return (obj == null) ? GetDefaultValue(t) : Convert.ChangeType(obj, u);
} else {
return Convert.ChangeType(obj, t);
}
}
private object GetDefaultValue(Type t)
{
if (t.GetTypeInfo().IsValueType) {
return Activator.CreateInstance(t);
}
return null;
}
private string Dashify(string source)
{
string result = "";
var chars = source.ToCharArray();
for (int i = 0; i < chars.Length; ++i) {
var c = chars[i];
if (i > 0 && char.IsUpper(c)) {
result += '-';
}
result += char.ToLower(c);
}
return result;
}
}
}
Run Code Online (Sandbox Code Playgroud)