2014-06-29 19 views
10

Tôi đang cố gắng triển khai ng-flow https://github.com/flowjs/ng-flow để tải lên tệp. Nó tải lên các tập tin trong đoạn, tôi thành công thiết lập này trên máy khách nhưng tôi không chắc chắn làm thế nào để xử lý tập tin trên backend bên trong phương pháp api web.Cách tải tệp lên theo khối trong ASP.NET bằng cách sử dụng ng-Flow

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

Yêu cầu chứa các thông tin sau enter image description here

Trả lời

7

Dưới đây là bộ điều khiển Web API ASP.NET mà tôi đã đưa ra để cứu các khối và lắp ráp chúng.

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 này đã triển khai phân tích cú pháp và hợp nhất các luồng js luồng trên MVC.

Rất dễ thực hiện. Chỉ cần thả các tệp được cung cấp trong dự án của bạn và trình điều khiển của bạn sẽ trông giống như this

- Tuyên bố từ chối trách nhiệm. Tôi là tác giả của repo này.

+0

Đây có phải là trang web hỗ trợ Api không? Cảm ơn. – Sampath

Các vấn đề liên quan