【问题标题】:Uploading a file to a webservice without saving to server, database, or locally将文件上传到 Web 服务而不保存到服务器、数据库或本地
【发布时间】:2014-06-27 15:35:38
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    当你的表单动作被调用时,ASP.NET 已经做了很多解释文件上传的魔法,所以你不能在动作本身做很多事情。但是,您可以使用 HttpModule 或 HttpHandler 在多部分形式的字节流中捕获它们。

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

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

    【讨论】:

    • PS--注意 Royi Namir 在该示例底部的注释:虽然这是一个使用 Http Handler 的示例,但这段代码的编写方式并没有充分利用 @ 987654322@ 操作性质。
    猜你喜欢
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多