#c# #.net #azure #asp.net-core #blob
Вопрос:
Я пытаюсь создать галерею больших двоичных объектов в VS2019. Я создал жереха .Проект NET core (MVC) с конфигурацией HTTPS, .NET Core 3.1 и без аутентификации. У меня есть хранилище больших двоичных объектов в Azure, но в этом проекте я использую обозреватель хранилища Azure с включенным эмулятором. Когда я начинаю проект, он показывает мне хорошую html-страницу, и кнопка, которую я могу выбрать для загрузки, работает нормально, но когда я нажимаю кнопку загрузки, я получаю сообщение об ошибке «https: // localhost: 44330 / Home / UploadAsync». Я думаю, что это может быть связано с ошибкой, которую я не вижу в homecontroller, потому что я реализовал ее и html с файлами css.
Я добавлю, что соединение выполняется в appsettings.json
файле с помощью команды "StorageConnectionString": "UseDevelopmentStorage=true"
. После этого в эмуляторе я вижу новую папку, имя которой закрывается кодом. Я использую WindowsAzure.Упаковка для хранения.
Код домашнего контроллера:
namespace WebApplication.Controllers
{
public class HomeController : Controller
{
static CloudBlobClient _blobClient;
const string _blobContainerName = "imagecontainer";
private readonly IConfiguration _configuration;
static CloudBlobContainer _blobContainer;
public HomeController(IConfiguration configuration)
{
_configuration = configuration;
}
public async Task<ActionResult> Index()
{
try
{
var storageConnectionString = _configuration.GetValue<string>("StorageConnectionString");
var storageAccount = CloudStorageAccount.Parse(storageConnectionString);
_blobClient = storageAccount.CreateCloudBlobClient();
_blobContainer = _blobClient.GetContainerReference(_blobContainerName);
await _blobContainer.CreateIfNotExistsAsync();
await _blobContainer.SetPermissionsAsync(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });
List<Uri> allBlobs = new List<Uri>();
BlobContinuationToken blobContinuationToken = null;
do
{
var response = await _blobContainer.ListBlobsSegmentedAsync(blobContinuationToken);
foreach (IListBlobItem blob in response.Results)
{
if (blob.GetType() == typeof(CloudBlockBlob))
allBlobs.Add(blob.Uri);
}
blobContinuationToken = response.ContinuationToken;
} while (blobContinuationToken != null);
return View(allBlobs);
}
catch (Exception ex)
{
ViewData["message"] = ex.Message;
ViewData["trace"] = ex.StackTrace;
return View("Error");
}
}
[HttpPost]
public async Task<ActionResult> UploadAsync()
{
try
{
var request = await HttpContext.Request.ReadFormAsync();
if (request.Files == null)
{
return BadRequest("Could not upload files");
}
var files = request.Files;
if (files.Count == 0)
{
return BadRequest("Could not upload empty files");
}
for (int i = 0; i < files.Count; i )
{
var blob = _blobContainer.GetBlockBlobReference(GetRandomBlobName(files[i].FileName));
using (var stream = files[i].OpenReadStream())
{
await blob.UploadFromStreamAsync(stream);
}
}
return RedirectToAction("Index");
}
catch (Exception ex)
{
ViewData["message"] = ex.Message;
ViewData["trace"] = ex.StackTrace;
return View("Error");
}
}
[HttpPost]
public async Task<ActionResult> DeleteImage(string name)
{
try
{
Uri uri = new Uri(name);
string filename = Path.GetFileName(uri.LocalPath);
var blob = _blobContainer.GetBlockBlobReference(filename);
await blob.DeleteIfExistsAsync();
return RedirectToAction("Index");
}
catch (Exception ex)
{
ViewData["message"] = ex.Message;
ViewData["trace"] = ex.StackTrace;
return View("Error");
}
}
[HttpPost]
public async Task<ActionResult> DeleteAll()
{
try
{
BlobContinuationToken blobContinuationToken = null;
do
{
var response = await _blobContainer.ListBlobsSegmentedAsync(blobContinuationToken);
foreach (IListBlobItem blob in response.Results)
{
if (blob.GetType() == typeof(CloudBlockBlob))
await ((CloudBlockBlob)blob).DeleteIfExistsAsync();
}
blobContinuationToken = response.ContinuationToken;
} while (blobContinuationToken != null);
return RedirectToAction("Index");
}
catch (Exception ex)
{
ViewData["message"] = ex.Message;
ViewData["trace"] = ex.StackTrace;
return View("Error");
}
}
private string GetRandomBlobName(string filename)
{
string ext = Path.GetExtension(filename);
return string.Format("{0:10}_{1}{2}", DateTime.Now.Ticks, Guid.NewGuid(), ext);
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}
Комментарии:
1. можете ли вы поделиться html-контентом?
Ответ №1:
В вашем html-файле переименуйте действие в Upload
вместо UploadAsync
@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
Комментарии:
1. Большое вам спасибо, это помогло