Загрузка файлов в приложение-функцию Azure для управления - PullRequest
0 голосов
/ 11 октября 2018

Отредактировано Спасибо @ Marco

Я пытаюсь написать функциональное приложение, которое захватывает SVG из URL и конвертирует его в PNG.Я знаю, что существуют API, которые делают это, например, CloudConvert , но они плохо работают со встроенными шрифтами, что для меня является обязательным требованием.

В любом случае, я написал очень простую функциюприложение, которое просто загружает файл в этот момент.Все отлично работает локально, но когда я публикую в Azure, я получаю An exception occurred during a WebClient request.

Благодаря предложению @ Marco я переключился с WebClient на HTTPWebRequest, чтобы получить более подробную обработку ошибок, и в результате я вижуследующее:

2018-10-11T13: 53: 53.558 Функция [Информация] запущена (Id = e3cbda04-140e-4ef7-ad6c-c871ffe179dd)
2018-10-11T13: 53:53.590 [Info] C # HTTP триггерная функция обработала запрос.2018-10-11T13: 53: 53.752 [Info] Ошибка загрузки
2018-10-11T13: 53: 53.752 [Info] Доступ к пути
'D: \ Windows \ system32 \ 734e16961fc276df.svg' запрещен.

Пытаюсь ли я сделать что-то, что невозможно, или есть исправление для этого?Есть ли способ настроить разрешения в функции Azure?Мне нужно вытащить файл для редактирования, а не просто работать с байтовым массивом.

Большое спасибо!

public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, 
        TraceWriter log, ExecutionContext context)
{
    log.Info("C# HTTP trigger function processed a request.");

    // parse query parameter
    string svgURL = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "l", true) == 0)
        .Value;

    if (svgURL == null)
    {
        // Get request body
        dynamic data = await req.Content.ReadAsAsync<object>();
        svgURL = data?.svgURL;
    }
    // download file from URL
    var uniqueName = GenerateId() ;
    try 
    { 
        using (var client = new WebClient())
        {
           client.DownloadFile(svgURL, uniqueName + ".svg" );
        }
    }
    catch (Exception e)
    {
        log.Info("Download Fail");
        log.Info(e.Message);
    }
}

1 Ответ

0 голосов
/ 11 октября 2018

Самый простой способ решить эту проблему - использовать временное хранилище.Я понимаю, почему Azure так и не захочет, чтобы функции забивали каталог приложения.Обновленный код ниже:

Я заменил это:

client.DownloadFile(svgURL, uniqueName + ".svg" );

На это:

client.DownloadFile(svgURL, Path.GetTempPath() + "\\" + uniqueName + ".svg" );

Работает как шарм.

Редактировать: Ниже представлен репозиторий GitHub, где я делаю этот звонок.Происходят другие события, но вы можете видеть, где я сохраняю временное хранилище.
https://github.com/osuhomebase/SVG2PNG-AzureFunction

...