4

我实现了一个 POST Rest 服务来将文件上传到我的服务器。我现在遇到的问题是我想按类型限制上传的文件。例如,我只想允许上传 .pdf 文件。

我试图做的是

            Task<Stream> task = this.Request.Content.ReadAsStreamAsync();
            task.Wait();
            FileStream requestStream = (FileStream)task.Result;

但不幸的是,不可能将 Stream 转换为 FileStream 并通过 requestStream.Name 访问类型。

有没有一种简单的方法(除了将流写入磁盘并检查类型)来获取文件类型?

4

1 回答 1

9

如果您将文件上传到 Web API 并且想要访问文件数据 ( Content-Disposition),您应该将文件上传为 MIME 多部分 ( multipart/form-data)。

在这里,我展示了一些关于如何从 HTML 表单、Javascript 和 .NET 上传的示例。

然后你可以做这样的事情,这个例子只检查 pdf/doc 文件:

public async Task<HttpResponseMessage> Post()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable,
                                                                   "This request is not properly formatted - not multipart."));
        }

        var provider = new RestrictiveMultipartMemoryStreamProvider();

        //READ CONTENTS OF REQUEST TO MEMORY WITHOUT FLUSHING TO DISK
        await Request.Content.ReadAsMultipartAsync(provider);

        foreach (HttpContent ctnt in provider.Contents)
        {
            //now read individual part into STREAM
            var stream = await ctnt.ReadAsStreamAsync();

            if (stream.Length != 0)
            {
                using (var ms = new MemoryStream())
                {
                    //do something with the file memorystream
                }
            }
        }
        return Request.CreateResponse(HttpStatusCode.OK);
    }
}

public class RestrictiveMultipartMemoryStreamProvider : MultipartMemoryStreamProvider
{
    public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
    {
        var extensions = new[] {"pdf", "doc"};
        var filename = headers.ContentDisposition.FileName.Replace("\"", string.Empty);

        if (filename.IndexOf('.') < 0)
            return Stream.Null;

        var extension = filename.Split('.').Last();

        return extensions.Any(i => i.Equals(extension, StringComparison.InvariantCultureIgnoreCase))
                   ? base.GetStream(parent, headers)
                   : Stream.Null;

    }
}
于 2013-02-18T15:18:45.400 回答