将文件下载到Azure函数应用以进行操作

时间:2018-10-11 13:17:05

标签: c# azure azure-functions azure-storage-blobs

已编辑,谢谢@Marco

我正在尝试编写一个功能应用程序,该应用程序从URL抓取SVG并将其转换为PNG。我知道有一些类似CloudConvert这样的API,但是它们不能很好地与嵌入式字体配合使用,这是我的要求。

无论如何,我编写了一个非常基本的功能应用程序,此时仅下载文件即可。在本地一切正常,但是当我发布到Azure时,我得到An exception occurred during a WebClient request.

由于@Marco的建议,我从WebClient切换到HTTPWebRequest以获得更详细的错误处理,结果,我看到了以下内容:

  

2018-10-11T13:53:53.558 [Info]功能已启动(Id = e3cbda04-140e-4ef7-ad6c-c871ffe179dd)
  2018-10-11T13:53:53.590 [Info] C#HTTP触发函数处理了一个请求。   2018-10-11T13:53:53.752 [信息]下载失败
  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 :(得分:1)

解决此问题的最简单方法是使用临时存储。我可以看到为什么Azure始终不希望函数包含应用程序目录的原因。下面更新了代码:

我替换了这个:

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

与此:

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

像魅力一样工作。

编辑: 以下是我进行此调用的GitHub存储库。还有其他事情,但是您可以看到我保存到临时存储的位置。
https://github.com/osuhomebase/SVG2PNG-AzureFunction