Я пытаюсь создать приложение, в котором пользователь может загрузить текстовый файл и получить измененный текст обратно.
Я использую React в качестве FE и ASP. NET Core для BE и Azure хранилище для хранилища базы данных.
Так выглядит мой HomeController. Я создал отдельный метод «UploadToBlob» для публикации данных
public class HomeController : Controller
{
private readonly IConfiguration _configuration;
public HomeController(IConfiguration Configuration)
{
_configuration = Configuration;
}
public IActionResult Index()
{
return View();
}
[HttpPost("UploadFiles")]
//OPTION B: Uncomment to set a specified upload file limit
[RequestSizeLimit(40000000)]
public async Task<IActionResult> Post(List<IFormFile> files)
{
var uploadSuccess = false;
string uploadedUri = null;
foreach (var formFile in files)
{
if (formFile.Length <= 0)
{
continue;
}
// read directly from stream for blob upload
using (var stream = formFile.OpenReadStream())
{
// Open the file and upload its data
(uploadSuccess, uploadedUri) = await UploadToBlob(formFile.FileName, null, stream);
}
}
if (uploadSuccess)
{
//return the data to the view, which is react display text component.
return View("DisplayText");
}
else
{
//create an error component to show there was some error while uploading
return View("UploadError");
}
}
private async Task<(bool uploadSuccess, string uploadedUri)> UploadToBlob(string fileName, object p, Stream stream)
{
if (stream is null)
{
try
{
string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
// Create a BlobServiceClient object which will be used to create a container client
BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
//Create a unique name for the container
string containerName = "textdata" + Guid.NewGuid().ToString();
// Create the container and return a container client object
BlobContainerClient containerClient = await blobServiceClient.CreateBlobContainerAsync(containerName);
string localPath = "./data/";
string textFileName = "textdata" + Guid.NewGuid().ToString() + ".txt";
string localFilePath = Path.Combine(localPath, textFileName);
// Get a reference to a blob
BlobClient blobClient = containerClient.GetBlobClient(textFileName);
Console.WriteLine("Uploading to Blob storage as blob:\n\t {0}\n", blobClient.Uri);
FileStream uploadFileStream = File.OpenRead(localFilePath);
await blobClient.UploadAsync(uploadFileStream, true);
uploadFileStream.Close();
}
catch (StorageException)
{
return (false, null);
}
finally
{
// Clean up resources, e.g. blob container
//if (blobClient != null)
//{
// await blobClient.DeleteIfExistsAsync();
//}
}
}
else
{
return (false, null);
}
}
}
, но консоль выдает ошибки, говоря, что «'ControllerBase.File (byte [], string)' является недопустимым методом в данном контексте (CS0119) "
И из-за этой ошибки следует другая ошибка" HomeController.UploadToBlob (string, object, Stream) ': не все пути кода возвращают значение (CS0161) "
мои вопросы
- Лучше ли создать отдельный метод, как я?
- как я могу решить вопрос о том, что «Файл» действителен внутри метода UploadToBlob?
- Если я хочу добавить проверку типа файла, где это должно произойти? t.ex. alid * only text file
- Если я хочу прочитать текстовую строку из загруженного текстового файла, где я должен вызвать
string contents = blob.DownloadTextAsync().Result;
return contents;
Как передать "содержимое" моему компоненту реакции? что-то вроде этого?
useEffect(() => {
fetch('Home')
.then(response => response.json())
.then(data => {
setForcasts(data)
})
}, [])
Спасибо за помощь этому суперновому ie с ASP. NET Core!