我正在创建一个允许用户上传文件的Web服务,然后我将对文件进行一些更改并返回文件。但我想获取该文件内容而不将其保存到服务器,数据库或本地。相反,我想将内容保存到流或类似的东西中,以便我可以对其内容运行修改并返回新文件。
我尝试过以下操作,但只能弄清楚如何上传和保存本地。目前,文件信息是从表单数据和文件头中收集的。
namespace FileConverter.Controllers
{
[RoutePrefix("api/test")]
public class FileUploadController : ApiController
{
private static readonly string ServerUploadFolder = "C:\\Temp"; //Path.GetTempPath();
[Route("files")]
[HttpPost]
[ValidateMimeMultipartContentFilter]
public async Task<FileResult> UploadSingleFile()
{
var streamProvider = new MultipartFormDataStreamProvider(ServerUploadFolder);
await Request.Content.ReadAsMultipartAsync(streamProvider);
return new FileResult
{
FileNames = streamProvider.FileData.Select(entry => entry.LocalFileName),
Names = streamProvider.FileData.Select(entry => entry.Headers.ContentDisposition.FileName),
ContentTypes = streamProvider.FileData.Select(entry => entry.Headers.ContentType.MediaType),
};
}
}
}
我使用ValidateMimeMultipartContentFilter属性来检查是否发送了正确的MIME类型。
namespace FileConverter.Controllers
{
public class ValidateMimeMultipartContentFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (!actionContext.Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
}
}
}
然后我设置了一个模型来存储一些数据。
namespace FileConverter.Controllers
{
public class FileResult
{
public IEnumerable<string> FileNames { get; set; }
public IEnumerable<string> ContentTypes { get; set; }
public IEnumerable<string> Names { get; set; }
}
}
有没有什么方法可以在Stream / byte []中获取文件的内容,而无需在本地保存文件然后读取其内容?如果是这样,我该怎么做呢?
答案 0 :(得分:0)
在调用表单操作时,ASP.NET已经为解释文件上载做了很多魔术,因此您无法在操作本身内做很多事情。但是,您可以使用HttpModule或HttpHandler捕获多部分表单中的字节流。
This example似乎是一个很好的起点。
我不知道HttpRequest是否可以在收到有效载荷之后开始返回数据,所以如果你真的想要&#34; stream&#34,这可能需要一些疯狂的交叉请求魔法;过滤过程。另一方面,如果您打算在处理文件时将整个文件保留在内存中,然后再将其发回,我认为您最好允许MVC将文件保存为临时文件文件:在上传文件时,将整个上传的文件保留在内存中,可能会导致性能下降。