gpt4 book ai didi

asp.net - WebAPI方法需要文件上传和其他参数

转载 作者:行者123 更新时间:2023-12-01 14:45:34 25 4
gpt4 key购买 nike

我想上传一个文件,并与文件一起发送一些其他信息,比如说一个字符串foo和一个int bar。

如何编写一个ASP.NET WebAPI Controller 方法来接收文件上载,字符串和整数?

我的JavaScript:

var fileInput = document.querySelector("#filePicker");
var formData = new FormData();
formData.append("file", fileInput.files[0]);
formData.append("foo", "hello world!");
formData.append("bar", 42);

var options = {
url: "/api/foo/upload",
data: formData,
processData: false // Prevents JQuery from transforming the data into a query string
};
$.ajax(options);

我的WebAPI Controller 可以像这样访问文件:
public async Task<HttpResponseMessage> Upload()
{
var streamProvider = new MultipartMemoryStreamProvider();
await Request.Content.ReadAsMultipartAsync(streamProvider);
var fileStream = await streamProvider.Contents[0].ReadAsStreamAsync();
}

但是我不清楚我如何才能得到我的字符串和整数。我想我大概可以说streamProvider.Content [1]或其他任何东西,但这感觉 super 讨厌。

编写接受文件上传,字符串和整数的WebAPI Action 的正确方法是什么?

最佳答案

您可以创建自己的MultipartFileStreamProvider来访问其他参数。

ExecutePostProcessingAsync中,我们以多部分形式循环浏览每个文件并加载自定义数据(如果只有一个文件,则CustomData列表中将只有一个对象)。

class MyCustomData
{
public int Foo { get; set; }
public string Bar { get; set; }
}

class CustomMultipartFileStreamProvider : MultipartMemoryStreamProvider
{
public List<MyCustomData> CustomData { get; set; }

public CustomMultipartFileStreamProvider()
{
CustomData = new List<MyCustomData>();
}

public override Task ExecutePostProcessingAsync()
{
foreach (var file in Contents)
{
var parameters = file.Headers.ContentDisposition.Parameters;
var data = new MyCustomData
{
Foo = int.Parse(GetNameHeaderValue(parameters, "Foo")),
Bar = GetNameHeaderValue(parameters, "Bar"),
};

CustomData.Add(data);
}

return base.ExecutePostProcessingAsync();
}

private static string GetNameHeaderValue(ICollection<NameValueHeaderValue> headerValues, string name)
{
var nameValueHeader = headerValues.FirstOrDefault(
x => x.Name.Equals(name, StringComparison.OrdinalIgnoreCase));

return nameValueHeader != null ? nameValueHeader.Value : null;
}
}

然后在您的 Controller 中:
class UploadController : ApiController
{
public async Task<HttpResponseMessage> Upload()
{
var streamProvider = new CustomMultipartFileStreamProvider();
await Request.Content.ReadAsMultipartAsync(streamProvider);

var fileStream = await streamProvider.Contents[0].ReadAsStreamAsync();
var customData = streamProvider.CustomData;

return Request.CreateResponse(HttpStatusCode.Created);
}
}

关于asp.net - WebAPI方法需要文件上传和其他参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23729458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com