【发布时间】: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