我正在使用允许访问文件服务器的C#/ MVC / WebAPI创建REST服务。两个主要操作是上传文件或下载文件。我需要将服务公开给Window和Apple上的移动设备(Android和Apple)和Web浏览器。
我似乎无法找到有关如何设计此类功能的任何良好指导或最佳做法。我之前只构建了REST服务,使用JSON传递或返回数据。我看到了C#的例子,但后来被C#客户端代码使用了。我觉得文件涉及平台细节开始很重要,但我找不到任何支持这些的信息。也许我正在过度思考它。
我正在寻找的是建议或信息链接,其中概述了上传和下载文件的标准。例如,只要您接受POST调用中的文件进行上传,就足够了(让客户知道如何发布该文件)?如果有文件,我应该上传多少元数据?是通过GET调用下载文件以使调用返回文件的URL的最佳方法吗?我应该注意其他任何“陷阱”吗?
答案 0 :(得分:2)
我怀疑你是在考虑它,上传和下载文件是相当标准的HTTP内容,没有任何特定于它的平台。下面是我前一段时间写的示例上传和下载web api操作,希望能指出正确的方向。
[Route("api/upload/")]
[HttpPost]
public async Task<IHttpActionResult> Upload()
{
if (!Request.Content.IsMimeMultipartContent())
{
return StatusCode(HttpStatusCode.UnsupportedMediaType);
}
var provider = new MultipartMemoryStreamProvider();
await Request.Content.ReadAsMultipartAsync(provider);
var file = provider.Contents.FirstOrDefault();
if (file == null)
{
return BadRequest("No file found");
}
var fileStream = await file.ReadAsStreamAsync();
// Do something with thte filestream
return Ok();
}
[Route("api/download/{id}")]
[HttpGet]
public async Task<IHttpActionResult> Download(Guid id)
{
if (id == default(Guid))
{
return NotFound();
}
var file = await SomeAsynchMethod(id); // returns custom File type.
if (file == null)
{
return NotFound();
}
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(file.FileDataBytes)
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue(file.FileType);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attatchment")
{
FileName = file.FileName
};
return ResponseMessage(result);
}
答案 1 :(得分:2)