我正在创建一个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已经做出了很多神奇的操作来解释文件上传,因此您实际上无法在操作本身中做很多事情。但是,您可以使用HttpModule或HttpHandler捕获字节流形式的多段形式的字节流。
这个例子似乎是一个很好的起点。
我不知道HttpRequest是否可以在接收到有效负载之后才开始返回数据,因此,如果您确实想“流式传输”过滤过程,那么这可能将需要一些疯狂的交叉请求魔术。另一方面,如果您打算在处理整个文件时将其保存在内存中,然后再发送回去,那么我建议您最好允许MVC将文件另存为临时文件: d将整个上载的文件保存在内存中时,可能会导致性能下降。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句