簡體   English   中英

從ASP.NET上載到Azure Blob的文件為空

[英]Uploaded file from ASP.NET to Azure blob is empty

我不確定會出現什么問題。 我正在開發一個簡單的測試,即將映像上傳到我的Azure存儲。 但是,該文件存在,但在存儲中為空。 看來上傳無效,我也不明白為什么。 我有這個控制器:

Create.cshtml.cs

namespace CoreWebApp.Pages
{
    public class CreateModel : PageModel
    {
        public void OnGet()
        {
        }

        [BindProperty]
        public CountryForm Country { get; set; }

        [HttpPost("CreateCountry")]
        public async Task<IActionResult> OnPostAsync(IFormFile file)
        {
            if (!ModelState.IsValid)
                return Page();

            /*var errors = ModelState.Where(x => x.Value.Errors.Count > 0)
                                    .Select(x => new { x.Key, x.Value.Errors })
                                    .ToArray();*/

            var filePath = Path.GetTempFileName();
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(stream);

                string pictureUrl = Shared.AzureCloud.AzureCDN.GetAzureCDNInstance().UploadFile(stream, file.Name);
                try
                {
                    if (pictureUrl != null)
                        Shared.Database.SqlAction.CountriesTable.AddCountry(new Country()
                        {
                            Name = Country.Name,
                            PictureUrl = pictureUrl
                        });
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }

            return Page();
        }
    }
}

Create.cshtml

@page
@model CreateModel
@{
    ViewData["Title"] = "Create";    
}

<div class="container">
  <div class="row">
    <div class="col-lg-3" style="background-color:#FF0000;">
        <h4>Add a Country</h4>
        <form class="form form-horizontal" method="post" enctype="multipart/form-data" asp-controller="Create">
          <div asp-validation-summary="All"></div>
          <div class="row">
            <div class="col-md-12">
              <div class="form-group">
                <label asp-for="Country.Name" class="col-md-3 right">Name:</label>
                <div class="col-md-9">
                  <input asp-for="Country.Name" class="form-control" />
                  <span asp-validation-for="Country.Name"></span>
                </div>
              </div>
              <div class="form-group">
                <div class="col-md-10">
                    <p>Picture</p>
                    <input type="file" name="file" />
                </div>
              </div>
            </div>
          </div>
          <div class="row">
            <div class="col-md-12">
              <button type="submit">Create</button>
            </div>
          </div>
        </form>
    </div>
    <div class="col-*-*"></div>
  </div>
  <div class="row">
    <div class="col-*-*"></div>
    <div class="col-*-*"></div>
    <div class="col-*-*"></div>
  </div>
  <div class="row">
    ...
  </div>
</div>

我的AzureCDN類只是一個封裝:

namespace Shared.AzureCloud
{
    public class AzureCDN
    {
        private CloudStorageAccount storageAccount { get; set; }
        private CloudBlobClient blobClient { get; set; }
        private CloudBlobContainer container { get; set; }
        private CloudBlockBlob blockBlob { get; set; }

        /// <summary>
        /// Initializes a new instance of the <see cref="T:Shared.AzureCloud.AzureCDN"/> class.
        /// </summary>
        public AzureCDN()
        {
            // Retrieve storage account from connection string.
            storageAccount = CloudStorageAccount.Parse(String.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",
                                                                                         Shared.Constants.Azure.AccountName, Shared.Constants.Azure.AccountKey));
            // Create the blob client.
            blobClient = storageAccount.CreateCloudBlobClient();

            // Retrieve a reference to a container.
            container = blobClient.GetContainerReference("eyesmedias");

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

        /// <summary>
        /// Uploads the file.
        /// </summary>
        /// <returns>The file.</returns>
        /// <param name="fileStream">File stream.</param>
        /// <param name="fileName">File name.</param>
        public string UploadFile(FileStream fileStream, string fileName)
        {
            // Retrieve reference to a blob named {name}.
            blockBlob = container.GetBlockBlobReference(fileName);

            try
            {
                // Create or overwrite the {name} "blob with contents from a local file.
                blockBlob.UploadFromStreamAsync(fileStream);
                return (blockBlob.Uri.ToString());

            } catch (Exception e)
            {
                throw e;
            }
        }

        #region Singletown part

        /// <summary>
        /// The instance.
        /// </summary>
        private static AzureCDN Instance = null;

        /// <summary>
        /// Gets the azure CDN Instance.
        /// </summary>
        /// <returns>The azure CDNI nstance.</returns>
        public static AzureCDN GetAzureCDNInstance()
        {
            if (Instance == null)
            {
                Instance = new AzureCDN();
            }
            return (Instance);
        }

        /// <summary>
        /// Sets the azure CDN Instance.
        /// </summary>
        /// <param name="instance">Instance.</param>
        public static void SetAzureCDNInstance(AzureCDN instance)
        {
            Instance = instance;
        }

        /// <summary>
        /// Init this instance.
        /// </summary>
        public static void Init()
        {
            Instance = new AzureCDN();
        }

        #endregion
    }
}

事情是, blockBlob.UploadFromStreamAsync(fileStream); 似乎沒問題,因為它不會引發任何異常並且可以很好地返回路徑,但是,即使文件位於我的CDN上,它也是空的,這與我在Mac上從ASP中選擇的文件不同。 NET頁面。

我是ASP.NET的新手(我從2天前開始),也歡迎您從Web應用程序ASP.NET上傳文件的建議:)

謝謝你的幫助 !

將文件復制到流之后,必須使用stream.Seek(0, SeekOrigin.Begin);再次將流的位置設置為開頭stream.Seek(0, SeekOrigin.Begin); (請參閱docs ),以便將實際內容上傳:

        [HttpPost("CreateCountry")]
        public async Task<IActionResult> OnPostAsync(IFormFile file)
        {
            if (!ModelState.IsValid)
                return Page();

            /*var errors = ModelState.Where(x => x.Value.Errors.Count > 0)
                                    .Select(x => new { x.Key, x.Value.Errors })
                                    .ToArray();*/

            var filePath = Path.GetTempFileName();
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(stream);

                stream.Seek(0, SeekOrigin.Begin); 

                string pictureUrl = Shared.AzureCloud.AzureCDN.GetAzureCDNInstance().UploadFile(stream, file.Name);
                try
                {
                    if (pictureUrl != null)
                        Shared.Database.SqlAction.CountriesTable.AddCountry(new Country()
                        {
                            Name = Country.Name,
                            PictureUrl = pictureUrl
                        });
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }

            return Page();
        }

如果您不這樣做,那么您正在上傳的流中當前位置已經在末尾,因此將上傳一個空文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM