#c# #azure #model-view-controller #download
#c# #azure #модель-представление-контроллер #Скачать
Вопрос:
Я пытаюсь загрузить файлы из Azure на компьютер через веб-приложение. Это работает, когда я запускаю проект локально, но при загрузке на ftp-сервер он не загружается.
Я попробовал среду.Специальная папка.Персональный, настольный и т.д.
public async Task<bool> DownloadBlobAsync(string file, string fileExtension, string directory)
{
string downlaodPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
_container = _client.GetContainerReference(containerName);
_directoy = _container.GetDirectoryReference(directory);
CloudBlockBlob blockBlob = _directoy.GetBlockBlobReference(file "." fileExtension);
using (var fileStream = File.OpenWrite(downlaodPath "/" file "." fileExtension))
{
await blockBlob.DownloadToStreamAsync(fileStream);
return true;
}
}
Ожидаемый результат должен быть в документах или на рабочем столе.
Комментарии:
1. Если вы размещаете веб-приложение на веб-сервере, то весьма вероятно, что у вас нет доступа к рабочему столу или личной папке. Это может быть связано с тем, что веб-приложение работает под специальной учетной записью пользователя, которая имеет ограничения на то, к чему оно может получить доступ в отношении локального компьютера. Я хотел бы загрузить большой двоичный объект во временную папку (есть API, которые помогут вам сгенерировать имя временного файла, которое находится в расположении, к которому веб-приложение будет иметь доступ). Стоило бы обновить ваш вопрос, указав подробную информацию о том, что вы хотите сделать с файлом после его загрузки.
2. Это для загрузки файлов, которые они выбирают. Например, существует файл с именем myimage.png. Они могут щелкнуть по нему и загрузить его.
3. Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь сохранить C: вместо папки Documents. Когда я вижу ошибки в браузере, это то, что пытается сделать вместо пути к папке документов или загрузок
Ответ №1:
Проблема, которую вы видите, связана с тем, что ваш код выполняется на веб-сервере, а не на компьютере клиентов (пользователей).
Другими словами, когда вы пытаетесь сохранить в Environment.SpecialFolder.Personal
, вы пытаетесь сохранить его в эту папку на веб-сервере, а не на настольном компьютере пользователя.
Что вам нужно сделать, это вернуть содержимое большого двоичного объекта в запросе и позволить браузеру сохранить файл — пользователю, скорее всего, будет предложено (в зависимости от настроек его браузера), где именно его сохранить. Вы не должны указывать это.
Вот пример того, как это сделать:
public async Task<HttpResponseMessage> DownloadBlobAsync(string file, string fileExtension, string directory)
{
_container = _client.GetContainerReference(containerName);
_directoy = _container.GetDirectoryReference(directory);
CloudBlockBlob blockBlob = _directoy.GetBlockBlobReference(file "." fileExtension);
using (var ms = new MemoryStream())
{
await blockBlob.DownloadToStreamAsync(ms);
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(ms.ToArray())
};
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "somefilename.ext"
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue(blockBlob.Properties.ContentType);
return resu<
}
}
Обратите внимание, что это неэффективно, так как сначала большой двоичный объект будет загружен на веб-сервер, а затем возвращен клиенту. Этого должно быть достаточно для начала.
Когда браузер обнаружит эту конечную точку, пользователю будет предложено сохранить файл где-нибудь на своем компьютере.
Комментарии:
1. Таким образом, я мог бы использовать jquery для извлечения файла и разрешить пользователю сохранять его. Вопрос: результат. Содержание. Заголовки. ContentType = новое значение MediaTypeHeaderValue (res.ContentType); Какое значение в конце? Я не вижу переменной для его объявления или передачи ему
2. Результат. Содержание. Заголовки. ContentType = новое значение MediaTypeHeaderValue(блокблок. Свойства. ContentType); Я думаю, что это то, что происходит в этой строке
3. Да — я обновил код (я основал его на некоторых других материалах, которые использовал внутри компании). То, как вы попадаете в эту конечную точку, действительно зависит от того, как вы создали свой интерфейс.
4. То, что я сделал, просто сделало Azure общедоступным, чтобы я мог загружать ссылки напрямую. Это упростило задачу, и поскольку все эти файлы в любом случае будут доступны для скачивания, у blob-объекта нет причин быть закрытым.