2013-07-02 8 views
1

파일을 업로드하고 실제 파일로 서버에 저장하는 방법을 알고 있습니다. 성공적으로이 솔루션을 구현 했으므로 그물에 많은 예제가 있습니다.서버에 파일을 업로드하고 SQL Server 데이터베이스에 저장하는 웹 API 컨트롤러

이제 파일 업로드를 검색하고 SQL Server 데이터베이스에 저장합니다. 완전히 다른 접근 방식입니까? 나는 그물에 대한 몇 가지 예를 찾을 수 없습니다.

구체적인 구현을위한 모든 블로그/예제를 환영합니다.

감사합니다.

[HttpPost] 
    public Task<HttpResponseMessage> Post() 
    { 
     string RootPath = HttpContext.Current.Server.MapPath("~/" + RootFolder); 

     if (Request.Content.IsMimeMultipartContent()) 
     { 
      var streamProvider = new CustomMultipartFormDataStreamProvider(RootPath); 
      var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith<HttpResponseMessage>(t => 
      { 
       if (t.IsFaulted || t.IsCanceled) 
       { 
        throw new HttpResponseException(HttpStatusCode.InternalServerError); 
       } 

       // Move the file to the right destination depending on the type (defined client side)      
       string type = streamProvider.FormData.GetValues("type").FirstOrDefault(); 
       string fullname = streamProvider.FormData.GetValues("fullname").FirstOrDefault(); 
       FileType fileType; 

       if (!Enum.TryParse<FileType>(type, out fileType)) 
       { 
        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "The file type is incorrect")); 
       } 

       var DestPath = RootPath + "\\" + GetFolderName(fileType); 

       if (!Directory.Exists(DestPath)) 
        Directory.CreateDirectory(DestPath); 

       var fileInfo = streamProvider.FileData.Select(i => 
       { 
        var info = new FileInfo(i.LocalFileName); 
        var fileName = fullname + info.Extension; 
        var srcFile = RootPath + "\\" + info.Name; 
        var dstFile = DestPath + "\\" + fileName;       
        var filesize = info.Length; 

        switch (fileType) 
        { 
         case FileType.DriverCertificate: 
          if (File.Exists(dstFile)) 
           File.Delete(dstFile); 
          File.Move(srcFile, dstFile); 
          break; 
         default: 
          break; 
        } 
        return new FileDescription(fileName, DriverCertificatesFolder + "/" + fileName, filesize/1024); 
       }); 
       return new HttpResponseMessage() 
       { 
        Content = new JsonContent(new 
        { 
         Success = true, 
         Data = fileInfo 
        }) 
       }; 
       ; 
      }); 

      return task; 
     } 
     else 
     { 
      throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted")); 
     } 

    } 
+0

여기 내 대답을 살펴볼 수 있습니다. http : //stackoverflow.com/questions/15842496/is-it-possible-to-override-multipartformdatastreamprovider-so-that-is-doesnt-sa/15843410#15843410 ... AWS 스트림 대신 여기에서 대신 데이터베이스로 스트리밍 할 수 있습니다. –

답변

0

이 지금 정말 SQL 서버 질문이된다 :

다음은 (내가 MultipartFormDataStreamProvider을 사용하고 있습니다) 업로드하고 서버의 디스크에 파일을 저장하는 내 실제 솔루션입니다.

varbinary (max) 열에 이진 데이터를 저장해야합니다. 추가 도움이 here.

+2

이것은 SQL 질문이되기 전에 완벽하게 유효한 ASP.NET WEB API 질문입니다 :'업로드 된 파일을 어떻게 파일 시스템에 저장하지 않고 스트림으로 가져올 수 있습니까? '. 이 스트림을 받으면 SQL에 저장하는 것에 대한 답이 적용됩니다. 그래서이 질문의 첫번째 부분은 IMHO가 여기에서 더 중요합니다. 두 번째 부분은 이미 말했듯이, 인터넷에 충분한 자원 이상을 가지고 있기 때문입니다. –

+0

@DarinDimitrov OP는 "파일 시스템에 저장하지 않고"묻습니다. – Aliostad

+0

예, 정확히 그가 묻는 것입니다. 그는 이미 파일을 파일 시스템에 저장하고있는 코드를 보여주기 때문에 어떻게해야 하는지를 알 수있었습니다. –

관련 문제