Как загрузить файл в Azure из кода C #, используя angular в качестве внешнего интерфейса и передавая файл через api в контроллер api - PullRequest
0 голосов
/ 17 апреля 2019

Я разрабатываю приложение, в котором требуется загрузить файл в хранилище BLOB-объектов Azure.Я попробовал подключаемый модуль azure-blob-storage-service, который присутствует в угловом менеджере nuget.

Может кто-нибудь предложить какой-либо другой подход, например, загрузить его со стороны сервера, используя c #?

1 Ответ

0 голосов
/ 22 апреля 2019

Здесь вы можете найти хороший пример об использовании Angular SPA и веб-API, которые позволяют пользователю просматривать и удалять изображения в контейнере хранения Azure, а также загружать новые файлы.

В нем также показано, как создать контроллер веб-API для поддержки требуемой операции на стороне сервера

. Вот метод добавления контроллера

public async Task<IEnumerable<PhotoViewModel>> Add(HttpRequestMessage request) 
{ 
    CloudBlobClient blobClient = this.StorageAccount.CreateCloudBlobClient(); 
    CloudBlobContainer photoContainer = blobClient.GetContainerReference(this.ContainerName); 

    var provider = new AzureBlobMultipartFormDataStreamProvider(photoContainer); 

    await request.Content.ReadAsMultipartAsync(provider); 

    var photos = new List<PhotoViewModel>(); 

    foreach (var file in provider.FileData) 
    { 
        //the LocalFileName is going to be the absolute Uri of the blob (see GetStream) 
        //use it to get the blob info to return to the client 
        var blob = await photoContainer.GetBlobReferenceFromServerAsync(file.LocalFileName); 
        await blob.FetchAttributesAsync(); 

        photos.Add(new PhotoViewModel 
        { 
            Name = blob.Name, 
            Size = blob.Properties.Length / 1024, 
            Created = blob.Metadata["Created"] == null ? DateTime.Now : DateTime.Parse(blob.Metadata["Created"]), 
            Modified = ((DateTimeOffset)blob.Properties.LastModified).DateTime, 
            Url = blob.Uri.AbsoluteUri 
        }); 
    } 

    return photos;       
}

. Он создает экземпляр AzureBlobMultipartFormDataStreamProvider, производный от MultipartFormDataStreamProvider длясохраните файлы с их исходными именами в производном классе, а не с вычисленными именами.

public class AzureBlobMultipartFormDataStreamProvider : MultipartFormDataStreamProvider 
{ 
    private CloudBlobContainer BlobContainer { get; set; } 

    public AzureBlobMultipartFormDataStreamProvider(CloudBlobContainer blobContainer): base("azure") 
    { 
        this.BlobContainer = blobContainer; 
    } 

    public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) 
    { 
        if (parent == null) 
        { 
            throw new ArgumentNullException("parent"); 
        } 
        if (headers == null) 
        { 
            throw new ArgumentNullException("headers"); 
        } 

        var fileName = this.GetLocalFileName(headers);; 

        CloudBlockBlob blob = this.BlobContainer.GetBlockBlobReference(fileName); 
        blob.Metadata["Created"] = DateTime.Now.ToString(); 

        if (headers.ContentType != null) 
        { 
            blob.Properties.ContentType = headers.ContentType.MediaType; 
        } 

        this.FileData.Add(new MultipartFileData(headers, blob.Name)); 

        return blob.OpenWrite();             
    } 

    public override Task ExecutePostProcessingAsync() 
    {    

        return base.ExecutePostProcessingAsync(); 
    } 

    public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers) 
    { 
        //Make the file name URL safe and then use it & is the only disallowed url character allowed in a windows filename 
        var name = !string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName) ? headers.ContentDisposition.FileName : "NoName"; 
        return name.Trim(new char[] { '"' }) 
                    .Replace("&", "and"); 
    } 
}

Надеюсь, это поможет.

https://code.msdn.microsoft.com/windowsapps/AngularJS-with-Web-API-c05b3511/file/134548/3/AngularJS%20with%20Web%20API%20uploading%20files%20to%20Azure%20storage.zip

...