13

WindowsAzureに展開したいASP.NETMVC4アプリがあります。このアプリの一部には、写真のアップロードが含まれます。写真をアップロードしたら、にあるディレクトリに写真を保存したいと思い/pictures/uploadedます。

私の質問は、Windows Azureでホストされているアプリ内の相対パスに画像をアップロードするにはどうすればよいですか?これまで、私のアプリは仮想マシンでホストされていました。私は以下を使用して上記を行うことができました:

string path = ConfigurationManager.AppSettings["rootWebDirectory"] + "/pictures/uploaded;

// Get the file path
if (Directory.Exists(path) == false)
  Directory.CreateDirectory(path);

string filePath = path + "/uploaded" + DateTime.UtcNow.Milliseconds + ".png";
filePath = filePath.Replace("/", "\\").Replace("\\\\", "\\");

// Write the picture to the file system
byte[] bytes = GetPictureBytes();
using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
{
  fileStream.Write(bytes, 0, bytes.Length);
  fileStream.Flush();
  fileStream.Close();
}

現在、ConfigurationManager.AppSettings["rootWebDirectory"]絶対パスを指しています。私はこれが私の問題があるところだと信じています。これらすべてを相対パスに切り替える方法がわかりません。

ありがとうございました!

4

4 に答える 4

21

これは、紺碧でこれを設定する方法の説明と同じくらい簡単です。 http://geekswithblogs.net/MagnusKarlsson/archive/2012/12/02/how-to-use-azure-storage-for-images.aspx

//編集; これが私のブログの完全な例です(ブログが死んだ場合)。yourViewName.cshtml

 @model List<string>  
 @{
     ViewBag.Title = "Index";
 }

 <h2>Index</h2>
 <form action="@Url.Action("Upload")" method="post" enctype="multipart/form-data">

     <label for="file">Filename:</label>
     <input type="file" name="file" id="file1" />
     <br />
     <label for="file">Filename:</label>
     <input type="file" name="file" id="file2" />
     <br />
     <label for="file">Filename:</label>
     <input type="file" name="file" id="file3" />
     <br />
     <label for="file">Filename:</label>
     <input type="file" name="file" id="file4" />
     <br />
     <input type="submit" value="Submit" />

 </form>

 @foreach (var item in Model) {

     <img src="@item" alt="Alternate text"/>
  }

コントローラーのアクション

public ActionResult Upload(IEnumerable<HttpPostedFileBase> file)
         {
             BlobHandler bh = new BlobHandler("containername");
             bh.Upload(file);
             var blobUris=bh.GetBlobs();

             return RedirectToAction("Index",blobUris);
         }

あなたのモデル

 public class BlobHandler
     {
         // Retrieve storage account from connection string.
         CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
         CloudConfigurationManager.GetSetting("StorageConnectionString"));

         private string imageDirecoryUrl; 

         /// <summary>
         /// Receives the users Id for where the pictures are and creates 
         /// a blob storage with that name if it does not exist.
         /// </summary>
         /// <param name="imageDirecoryUrl"></param>
         public BlobHandler(string imageDirecoryUrl)
         {
             this.imageDirecoryUrl = imageDirecoryUrl;
             // Create the blob client.
             CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

             // Retrieve a reference to a container. 
             CloudBlobContainer container = blobClient.GetContainerReference(imageDirecoryUrl);

             // Create the container if it doesn't already exist.
             container.CreateIfNotExists();

             //Make available to everyone
             container.SetPermissions(
                 new BlobContainerPermissions
                 {
                     PublicAccess = BlobContainerPublicAccessType.Blob
                 });
         }

         public void Upload(IEnumerable<HttpPostedFileBase> file)
         {
             // Create the blob client.
             CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

             // Retrieve a reference to a container. 
             CloudBlobContainer container = blobClient.GetContainerReference(imageDirecoryUrl);

             if (file != null)
             {
                 foreach (var f in file)
                 {
                     if (f != null)
                     {
                         CloudBlockBlob blockBlob = container.GetBlockBlobReference(f.FileName);
                         blockBlob.UploadFromStream(f.InputStream);
                     }
                 }
             }
         }

         public List<string> GetBlobs()
         {
             // Create the blob client. 
             CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

             // Retrieve reference to a previously created container.
             CloudBlobContainer container = blobClient.GetContainerReference(imageDirecoryUrl);

             List<string> blobs = new List<string>();

             // Loop over blobs within the container and output the URI to each of them
             foreach (var blobItem in container.ListBlobs())
                 blobs.Add(blobItem.Uri.ToString());

             return blobs;
         }
     }
于 2013-01-15T21:37:09.587 に答える
10

データと画像は、Web サイトのディレクトリに保存することを意図していません。それがAzure Blob Storageがある理由です。

Azure は Web サイトをインスタンスにコピーすることで機能するため、複数のインスタンスが存在する場合、アップロードされた画像 (インスタンスのローカルに保存されている) が同期しなくなり、競合があれば画像が失われることさえあります。

本当にやりたい場合は、以下の行で必要なものが得られます。

string path = Server.MapPath("~/pictures/uploaded");
于 2013-01-14T17:45:12.503 に答える
3

ここには、必要なことを行う方法を正確に教えてくれる良い答えがいくつかあります。もしよろしければ代替案をご提案させてください。

個人的には、あなたのような問題を解決するためにAzure Blob Storageを利用しています。BLOB ストレージは、クラウド サービスが現在実行されている VM とは完全に分離された (フォルダー タイプの構造の) バイナリ ファイルを格納する、非常に安価で高速な方法です。

これにより、デプロイごとにアップロードを移行する必要がないため、既存のアプリケーションに対して移行または開発する際の自由度が高まります。BLOB ストレージ ファイルは、複数の Azure データセンター間で追加料金なしでトリプル レプリケートされ、デプロイ VM よりもはるかに耐障害性があります。

Blob Storage に移行すると、サイトがオフラインのときや VM がダウンしているときにもファイルにアクセスできるようになります。

すべてのリソースが同じマシン上に存在しなければならない共有コンピューティングの領域で作業しているわけではありません。Azure は、スケーラビリティとリソースの分離のために構築されました。BLOB ストレージは、ここで実行しようとしていることに特化して設計されています。

于 2013-01-14T19:01:23.417 に答える
-1
string path = HostingEnvironment.MapPath(@"~/pictures/uploaded");
于 2013-01-14T17:38:20.383 に答える