2014-12-04 69 views
2

我正在使用C#/ MVC/WebAPI創建REST服務,該服務將允許訪問文件服務器。這兩個主要操作將上傳文件或下載文件。我需要將此服務公開給Window和Apple上的移動設備(Android和Apple)以及Web瀏覽器。使用REST服務跨平臺文件上傳/下載指導

我似乎無法找到任何關於如何設計功能的良好指導方針或最佳實踐。在使用JSON傳遞或返回數據之前,我只創建了REST服務。我看到了C#的例子,但之後它們被C#客戶端代碼所使用。我覺得涉及平臺細節的文件開始變得重要,但我找不到任何支持該平臺的信息。也許我正在反思它。

我正在尋找的是建議或鏈接信息,概述上傳和下載文件休息的標準。例如,只要您在POST調用中接受一個文件進行上傳,這是否足夠了(讓客戶端知道如何發佈該文件)?我應該用文件上傳多少元數據,如果有的話?通過GET調用下載文件以使該調用返回一個url到文件是最好的方法嗎?有什麼其他的「陷阱」我應該知道嗎?

回答

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); 
}