3

현재 이미지를 비롯하여 모든 데이터를 SQL Azure에 저장하는 라이트 스위치 응용 프로그램이 있습니다. 그러나 Azure Blob Storage와 모든 비 - 바이너리 데이터를 별도로 보관하고 싶습니다.Lightswitch 2012를 사용하여 Azure Blob 저장소에 이미지 저장

lightswitch 앱에 엔티티를 저장 한 결과는 다음과 같아야합니다. SQL Azure를 삽입/업데이트하고 이미지를 BLOB 저장소에 삽입/업데이트합니다.

문제에 대한 최선의 접근 방식에 대한 제안 사항은 크게 감사하겠습니다. :)

+0

해결 방법을 찾으셨습니까? 똑같은 것을 찾고. –

+0

@NielsBosma 아래의 내 대답을 참조하십시오. – krzysztofkarolczak

답변

0

LightSwitch 응용 프로그램의 서버 측에 짧은 코드를 추가하여 관련 데이터 항목을 추가 및 업데이트 할 때 이미지를 Azure Blob에 저장했습니다.

namespace LightSwitchApplication 
{ 
    public partial class ApplicationDataService 
    { 
     string storageAccount = [aZURE_STORAGE_NAME_HERE] 
     string containerName = [CONTAINTER_NAME_HERE] 
     string policyName = [POLICY_NAME_HERE] 
     string policySig = [OBTAINED_POLICY_SIG_HERE] 

     partial void SaveChanges_Executing() 
     { 
      if (this.DataWorkspace.ApplicationData.Details.HasChanges) 
      { 
       EntityChangeSet changeSet = this.DataWorkspace.ApplicationData.Details.GetChanges(); 
       foreach (IEntityObject entity in changeSet.ModifiedEntities) 
       { 
        string type = entity.GetType().Name; 
        // ... 
        // My type of LightSwitch entities are for example "Places" 

        UploadFileToBlob((Place)entity, containerName, policyName, policySig); 
       } 
      } 
     } 

     private void UploadFileToBlob(Place p, String container, String policyName, String policySig) 
     { 
      string signature = "?sr=c&si=" + policyName + "&sig=" + policySig; 
      string file = p.Id + ".png"; 
      WebResponse resp = UploadFile(storageAccount, container, file, signature, p.Photo); 
     } 

     static WebResponse UploadFile(string storageAccount, string container, string filename, string signature, byte[] data) 
     { 
      try 
      { 
       var req = (HttpWebRequest)WebRequest.Create(string.Format("http://{0}.blob.core.windows.net/{1}/{2}{3}", storageAccount, container, filename, signature)); 
       req.Method = "PUT"; 
       req.ContentType = "image/png"; 
       req.ContentLength = data.Length; 
       req.Date = DateTime.UtcNow; 
       //req.Headers.Add("x-ms-date", DateTime.UtcNow.ToString()); 
       req.Headers.Add("x-ms-version", "2012-02-12"); 
       req.Headers.Add("x-ms-blob-type", "BlockBlob"); 

       using (Stream stream = req.GetRequestStream()) 
       { 
        stream.Write(data, 0, data.Length); 
       } 

       var a = req.Headers.ToString(); 

       return req.GetResponse(); 
      } 
      catch (Exception e) 
      { 
       // ... 
      } 
     } 
    } 
} 

해당 엔티티가 변경되면 언제든지 파일을 BLOB로 보냅니다. 대괄호 안의 값은 Azure 계정에 따라 변경해야합니다.

정책 서명을 얻는 방법은 공식 문서에 설명 된 공유 액세스 서명입니다. Part 1 & Part 2.

관련 문제