将文件上载到Web服务而不保存到服务器,数据库或本地

时间:2014-06-27 15:35:39

标签: asp.net web-services asp.net-mvc-4

我正在创建一个允许用户上传文件的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 []中获取文件的内容,而无需在本地保存文件然后读取其内容?如果是这样,我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

在调用表单操作时,ASP.NET已经为解释文件上载做了很多魔术,因此您无法在操作本身内做很多事情。但是,您可以使用HttpModule或HttpHandler捕获多部分表单中的字节流。

This example似乎是一个很好的起点。

我不知道HttpRequest是否可以在收到有效载荷之后开始返回数据,所以如果你真的想要&#34; stream&#34,这可能需要一些疯狂的交叉请求魔法;过滤过程。另一方面,如果您打算在处理文件时将整个文件保留在内存中,然后再将其发回,我认为您最好允许MVC将文件保存为临时文件文件:在上传文件时,将整个上传的文件保留在内存中,可能会导致性能下降。