2014-06-29 15 views
10

我正在嘗試執行ng-flow https://github.com/flowjs/ng-flow來進行文件上傳。它以塊的形式上傳文件,我成功地將其設置在客戶端上,但我不確定如何處理web api方法內的後端文件。如何使用ng-Flow在ASP.NET中以塊的形式上傳文件

public void Upload() 
     { 
      //how to handle file? 
     } 

請求包含以下信息 enter image description here

回答

7

下面是我想出來的,保存塊和組裝他們的ASP.NET Web API控制器。

using System; 
using System.Diagnostics; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Http; 
using System.IO; 
using System.Web; 
using System.Web.Http; 

namespace Api.Controllers 
{ 
    [RoutePrefix("api")] 
    public class FlowUploadController : ApiController 
    { 

     string root = Path.Combine(Path.GetTempPath(), "FlowUpload"); 

     [Route("flowupload"), AcceptVerbs("GET")] 
     public object Upload(
      int flowChunkNumber, 
      string flowIdentifier) 
     { 
      if (ChunkIsHere(flowChunkNumber, flowIdentifier)) 
      { 
       return Request.CreateResponse(HttpStatusCode.OK); 
      } 
      else 
      { 
       return Request.CreateResponse(HttpStatusCode.NotFound); 
      } 
     } 

     [Route("flowupload"), AcceptVerbs("POST")] 
     public async Task<object> Upload() 
     { 
      // Check if the request contains multipart/form-data. 
      if (!Request.Content.IsMimeMultipartContent()) 
      { 
       throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
      } 
      if (!Directory.Exists(root)) Directory.CreateDirectory(root); 
      var provider = new MultipartFormDataStreamProvider(root); 
      try 
      { 
       await Request.Content.ReadAsMultipartAsync(provider); 
       int chunkNumber = Convert.ToInt32(provider.FormData["flowChunkNumber"]); 
       int totalChunks = Convert.ToInt32(provider.FormData["flowTotalChunks"]); 
       string identifier = provider.FormData["flowIdentifier"]; 
       string filename = provider.FormData["flowFilename"]; 
       // Rename generated file 
       MultipartFileData chunk = provider.FileData[0]; // Only one file in multipart message 
       RenameChunk(chunk, chunkNumber, identifier); 
       // Assemble chunks into single file if they're all here 
       TryAssembleFile(identifier, totalChunks, filename); 
       // Success 
       return Request.CreateResponse(HttpStatusCode.OK); 
      } 
      catch (System.Exception e) 
      { 
       return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e); 
      } 

     } 

     private string GetChunkFileName(int chunkNumber, string identifier) 
     { 
      return Path.Combine(root, string.Format("{0}_{1}", identifier, chunkNumber.ToString())); 
     } 

     private void RenameChunk(MultipartFileData chunk, int chunkNumber, string identifier) 
     { 
      string generatedFileName = chunk.LocalFileName; 
      string chunkFileName = GetChunkFileName(chunkNumber, identifier); 
      if (File.Exists(chunkFileName)) File.Delete(chunkFileName); 
      File.Move(generatedFileName, chunkFileName); 

     } 

     private string GetFileName(string identifier) 
     { 
      return Path.Combine(root, identifier); 
     } 

     private bool ChunkIsHere(int chunkNumber, string identifier) 
     { 
      string fileName = GetChunkFileName(chunkNumber, identifier); 
      return File.Exists(fileName); 
     } 

     private bool AllChunksAreHere(string identifier, int totalChunks) 
     { 
      for (int chunkNumber = 1; chunkNumber <= totalChunks; chunkNumber++) 
       if (!ChunkIsHere(chunkNumber, identifier)) return false; 
      return true; 
     } 

     private void TryAssembleFile(string identifier, int totalChunks, string filename) 
     { 
      if (AllChunksAreHere(identifier, totalChunks)) 
      { 
       // Create a single file 
       var consolidatedFileName = GetFileName(identifier); 
       using (var destStream = File.Create(consolidatedFileName, 15000)) 
       { 
        for (int chunkNumber = 1; chunkNumber <= totalChunks; chunkNumber++) 
        { 
         var chunkFileName = GetChunkFileName(chunkNumber, identifier); 
         using (var sourceStream = File.OpenRead(chunkFileName)) 
         { 
          sourceStream.CopyTo(destStream); 
         } 
        } 
        destStream.Close(); 
       } 
       // Rename consolidated with original name of upload 
       filename = Path.GetFileName(filename); // Strip to filename if directory is specified (avoid cross-directory attack) 
       string realFileName = Path.Combine(root, filename); 
       if (File.Exists(filename)) File.Delete(realFileName); 
       File.Move(consolidatedFileName, realFileName); 
       // Delete chunk files 
       for (int chunkNumber = 1; chunkNumber <= totalChunks; chunkNumber++) 
       { 
        var chunkFileName = GetChunkFileName(chunkNumber, identifier); 
        File.Delete(chunkFileName); 
       } 
      } 
     } 

    } 
} 
1

這個repository on Github實現瞭解析和合並MVC上的流js塊。

這很容易實現。只要將提供的文件放在您的項目中,您的控制器看起來就像this

- 免責聲明。我是這個回購的作者。

+0

這是支持web Api嗎?謝謝。 – Sampath

相關問題