我有一个灯开关应用程序,它当前将所有数据存储在 SQL Azure 中——包括图像。但我想将图像单独保存在 Azure Blob 存储中,所有非二进制数据保持原样。
因此,在 lightswitch 应用程序中保存实体的结果应该如下:插入/更新数据 SQL Azure 并将图像插入/更新到 Blob 存储。
任何关于此问题的最佳方法的建议将不胜感激:)。
我有一个灯开关应用程序,它当前将所有数据存储在 SQL Azure 中——包括图像。但我想将图像单独保存在 Azure Blob 存储中,所有非二进制数据保持原样。
因此,在 lightswitch 应用程序中保存实体的结果应该如下:插入/更新数据 SQL Azure 并将图像插入/更新到 Blob 存储。
任何关于此问题的最佳方法的建议将不胜感激:)。
我在 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 帐户进行更改。