如何在webapi上传中获取Multipart文件的流? [英] How to get the stream for a Multipart file in webapi upload?
问题描述
我需要使用Stream(Azure Blobstorage)上传文件,但是无法找出如何从对象本身获取流.参见下面的代码.
I need to upload a file using Stream (Azure Blobstorage), and just cannot find out how to get the stream from the object itself. See code below.
我是WebAPI的新手,并使用了一些示例.我正在获取文件和文件数据,但这不是我上传方法的正确类型.因此,我需要获取或将其转换为正常的Stream,此刻这似乎有点困难:)
I'm new to the WebAPI and have used some examples. I'm getting the files and filedata, but it's not correct type for my methods to upload it. Therefore, I need to get or convert it into a normal Stream, which seems a bit hard at the moment :)
我知道我需要以某种方式使用ReadAsStreamAsync().Result
,但是由于我有两个提供者,因此它会在foreach循环中崩溃.内容(第一个看起来正确,第二个看起来不正确).
I know I need to use ReadAsStreamAsync().Result
in some way, but it crashes in the foreach loop since I'm getting two provider.Contents (first one seems right, second one does not).
[System.Web.Http.HttpPost]
public async Task<HttpResponseMessage> Upload()
{
if (!Request.Content.IsMimeMultipartContent())
{
this.Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
}
var provider = GetMultipartProvider();
var result = await Request.Content.ReadAsMultipartAsync(provider);
// On upload, files are given a generic name like "BodyPart_26d6abe1-3ae1-416a-9429-b35f15e6e5d5"
// so this is how you can get the original file name
var originalFileName = GetDeserializedFileName(result.FileData.First());
// uploadedFileInfo object will give you some additional stuff like file length,
// creation time, directory name, a few filesystem methods etc..
var uploadedFileInfo = new FileInfo(result.FileData.First().LocalFileName);
// Remove this line as well as GetFormData method if you're not
// sending any form data with your upload request
var fileUploadObj = GetFormData<UploadDataModel>(result);
Stream filestream = null;
using (Stream stream = new MemoryStream())
{
foreach (HttpContent content in provider.Contents)
{
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, content.ReadAsStreamAsync().Result);
stream.Position = 0;
filestream = stream;
}
}
var storage = new StorageServices();
storage.UploadBlob(filestream, originalFileName);**strong text**
private MultipartFormDataStreamProvider GetMultipartProvider()
{
var uploadFolder = "~/App_Data/Tmp/FileUploads"; // you could put this to web.config
var root = HttpContext.Current.Server.MapPath(uploadFolder);
Directory.CreateDirectory(root);
return new MultipartFormDataStreamProvider(root);
}
推荐答案
这与我几个月前遇到的困境相同(在MultipartStreamProvider
接管之前捕获上传流并将其自动神奇地保存到文件).建议是继承该类并重写方法……但这在我的情况下不起作用. :((我想将MultipartFileStreamProvider
和MultipartFormDataStreamProvider
的功能都集成到一个MultipartStreamProvider中,而没有自动保存的部分.)
This is identical to a dilemma I had a few months ago (capturing the upload stream before the MultipartStreamProvider
took over and auto-magically saved the stream to a file). The recommendation was to inherit that class and override the methods ... but that didn't work in my case. :( (I wanted the functionality of both the MultipartFileStreamProvider
and MultipartFormDataStreamProvider
rolled into one MultipartStreamProvider, without the autosave part).
这可能会有所帮助; 这是由一位Web API开发人员和
This might help; here's one written by one of the Web API developers, and this from the same developer.
这篇关于如何在webapi上传中获取Multipart文件的流?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!