Загрузить один файл в хранилище BLOB-объектов Azure
Как я могу загрузить файл с C#? Мне нужно загрузить файл из диалогового окна.
6 ответов
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("StorageKey");
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
// Retrieve reference to a blob named "myblob".
CloudBlockBlob blockBlob = container.GetBlockBlobReference("myblob");
// Create or overwrite the "myblob" blob with contents from a local file.
using (var fileStream = System.IO.File.OpenRead(@"path\myfile"))
{
blockBlob.UploadFromStream(fileStream);
}
смотрите здесь о необходимом SDK и ссылках
я думаю это то что тебе нужно
Поскольку WindowsAzure.Storage является устаревшей. С Microsoft.Azure.Storage.* мы можем использовать следующий код для загрузки
static async Task CreateBlob()
{
BlobServiceClient blobServiceClient = new BlobServiceClient(storageconnstring);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName);
BlobClient blobClient = containerClient.GetBlobClient(filename);
using FileStream uploadFileStream = File.OpenRead(filepath);
await blobClient.UploadAsync(uploadFileStream, true);
uploadFileStream.Close();
}
Следующий фрагмент кода является простейшей формой выполнения загрузки файла. Я добавил в этот код еще несколько строк, чтобы определить тип загружаемого файла и проверить наличие контейнера.
Примечание. Сначала необходимо добавить следующие пакеты NuGet.
Microsoft.AspNetCore.StaticFiles
Microsoft.Azure.Storage.Blob
Microsoft.Extensions.Configuration
static void Main(string[] args) { Console.WriteLine("Hello World!"); string connstring = "DefaultEndpointsProtocol=https;AccountName=storageaccountnewne9d7b;AccountKey=3sUU8J5pQQ+6YYIi+b5jo+BiSb5XPt027Rve6N5QP9iPEhMXZAbzUfsuW7QDWi1gSPecsPFpC6AzmA9jwPYs6g==;EndpointSuffix=core.windows.net"; string containername = "newturorial"; string finlename = "TestUpload.docx"; var fileBytes = System.IO.File.ReadAllBytes(@"C:\Users\Namal Wijekoon\Desktop\HardningSprint2LoadTest\" + finlename); var cloudstorageAccount = CloudStorageAccount.Parse(connstring); var cloudblobClient = cloudstorageAccount.CreateCloudBlobClient(); var containerObject = cloudblobClient.GetContainerReference(containername); //check the container existance if (containerObject.CreateIfNotExistsAsync().Result) { containerObject.SetPermissionsAsync(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); } var fileobject = containerObject.GetBlockBlobReference(finlename); //check the file type string file_type; var provider = new FileExtensionContentTypeProvider(); if(!provider.TryGetContentType(finlename, out file_type)) { file_type = "application/octet-stream"; } fileobject.Properties.ContentType = file_type; fileobject.UploadFromByteArrayAsync(fileBytes, 0 , fileBytes.Length); string fileuploadURI = fileobject.Uri.AbsoluteUri; Console.WriteLine("File has be uploaded successfully."); Console.WriteLine("The URL of the Uploaded file is : - \n" + fileuploadURI); }
Мы можем использовать класс BackgroundUploader, тогда нам нужно предоставить объект StorageFile и пространства имен Uri: Required:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Networking.BackgroundTransfer;
using Windows.Storage.Pickers;
using Windows.Storage;
Процесс выглядит следующим образом: Uri определяется с использованием строкового значения, предоставленного через поле ввода пользовательского интерфейса, и требуемый файл для загрузки, представленный объектом StorageFile, возвращается, когда конечный пользователь выбрал файл через пользовательский интерфейс, предоставленный пользовательским интерфейсом. Операция PickSingleFileAsync
Uri uri = new Uri(serverAddressField.Text.Trim());
FileOpenPicker picker = new FileOpenPicker();
picker.FileTypeFilter.Add("*");
StorageFile file = await picker.PickSingleFileAsync();
а потом:
BackgroundUploader uploader = new BackgroundUploader();
uploader.SetRequestHeader("Filename", file.Name);
UploadOperation upload = uploader.CreateUpload(uri, file);
// Attach progress and completion handlers.
await HandleUploadAsync(upload, true);
Это все
Вот полный метод.
[HttpPost]
public ActionResult Index(Doctor doct, HttpPostedFileBase photo)
{
try
{
if (photo != null && photo.ContentLength > 0)
{
// extract only the fielname
var fileName = Path.GetFileName(photo.FileName);
doct.Image = fileName.ToString();
CloudStorageAccount cloudStorageAccount = DoctorController.GetConnectionString();
CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference("images");
string imageName = Guid.NewGuid().ToString() + "-" +Path.GetExtension(photo.FileName);
CloudBlockBlob BlockBlob = cloudBlobContainer.GetBlockBlobReference(imageName);
BlockBlob.Properties.ContentType = photo.ContentType;
BlockBlob.UploadFromStreamAsync(photo.InputStream);
string imageFullPath = BlockBlob.Uri.ToString();
var memoryStream = new MemoryStream();
photo.InputStream.CopyTo(memoryStream);
memoryStream.ToArray();
memoryStream.Seek(0, SeekOrigin.Begin);
using (var fs = photo.InputStream)
{
BlockBlob.UploadFromStreamAsync(memoryStream);
}
}
}
catch (Exception ex)
{
}
return View();
}
где метод getconnectionstring это.
static string accountname = ConfigurationManager.AppSettings["accountName"];
static string key = ConfigurationManager.AppSettings["key"];
public static CloudStorageAccount GetConnectionString()
{
string connectionString = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", accountname, key);
return CloudStorageAccount.Parse(connectionString);
}
Полный контроллер веб-API для загрузки одного или нескольких файлов. .NET Framework 4.8
Установите пакет NuGet, Azure.Storage.Blob .
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.Configuration;
using System.Web;
using System.Web.Http;
namespace api.azure.Controllers
{
public class FileController : ApiController
{
[HttpPost]
[Route("api/BlobStorage/UploadFiles")]
public IHttpActionResult UploadFiles()
{
string result = "";
try
{
result = UploadFilesToBlob();
}
catch (Exception ex)
{
return Ok(ex.Message);
}
return Ok(result);
}
public string UploadFilesToBlob()
{
try
{
string storageConnectionString = ConfigurationManager.AppSettings["BlobStorageConnectionString"];
CloudStorageAccount blobStorage = CloudStorageAccount.Parse(storageConnectionString);
CloudBlobClient blobClient = blobStorage.CreateCloudBlobClient();
if (HttpContext.Current.Request.Form["BlobContainerName"] != null)
{
string blobContainerName = HttpContext.Current.Request.Form["BlobContainerName"].ToString();
CloudBlobContainer container = blobClient.GetContainerReference(blobContainerName);
container.CreateIfNotExists();
// Set public access level to the container.
container.SetPermissions(new BlobContainerPermissions()
{
PublicAccess = BlobContainerPublicAccessType.Container
});
string folderName = "";
if (HttpContext.Current.Request.Form["FolderNameToUploadFiles"] != null)
folderName = HttpContext.Current.Request.Form["FolderNameToUploadFiles"].ToString() + "/";
for (int i = 0; i < HttpContext.Current.Request.Files.Count; i++)
{
var httpPostedFile = HttpContext.Current.Request.Files[i];
if (httpPostedFile != null)
{
string blobName = folderName + httpPostedFile.FileName;
CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
blob.UploadFromStream(httpPostedFile.InputStream);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
return "# of file(s) sent to upload: " + HttpContext.Current.Request.Files.Count.ToString();
}
}
}