代码之家  ›  专栏  ›  技术社区  ›  Imran Ahmad Shahid

在Azure函数中将Post文件转换为Pdf

  •  0
  • Imran Ahmad Shahid  · 技术社区  · 6 年前

    我想实现的是将包含文本和文件的数据从html页面发布到azure函数,然后将数据发送到管理员电子邮件。我已经试过了,但现在可以把文件贴出来了。

              <script>
    
                 function myFormOnSubmit()
                 {
                     var formData = new FormData();
    
                     formData.append("firstname",$('#firstname').val());
                     formData.append("lastname",$('#lastname').val());
                     formData.append("phonenumber",$('#phonenumber').val());
                     formData.append("email",$('#email').val());
                     formData.append("position",'Software Engineer');
                     formData.append("resume", $('input[type=file]')[0].files[0]);
    
                    $.ajax({
                          url: "function URL",
                          type: 'POST',
                          data: formData,
                          success: function (data) {
                          alert(data)
                          },
                          cache: false,
                          contentType: false,
                          processData: false
                          });
    
                          return false;
                 }
    
              </script>
    

    Azure函数

          public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", "options", Route = null)]HttpRequestMessage req, TraceWriter log)
            {
                log.Info("C# HTTP trigger function processed a request.");
                if (req.Content.IsFormData())
                    log.Info("form data");
                if(req.Content.IsMimeMultipartContent())
                    log.Info("multimedia content");
                var provider = new MultipartFormDataStreamProvider("TempData\\");
                var multimediaProvider = await req.Content.ReadAsMultipartAsync(provider);
                var formData = multimediaProvider.FormData;
    
    
                var apiKey = "SendGridApi Key";
                var client = new SendGridClient(apiKey);
                var from = new EmailAddress("no_reply@domain.com", "Auto Generated");
                var subject = "Application for " + formData["position"];
    
    
    
    
                var to = new EmailAddress("admin email", "Admin");
                var plainTextContent = subject;
                var htmlContent = $"<strong>First Name :</strong> {formData["firstname"]}<br><strong>Last Name :</strong> {formData["lastname"]}<br><strong>Phone Number :</strong> {formData["phonenumber"]}<br><strong>Email :</strong> {formData["email"]}";
                var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
                client.SendEmailAsync(msg);
                // parse query parameter
    
      var resumeContent = multimediaProvider.Contents?.FirstOrDefault();
                if (resumeContent!=null)
                {
                    var resume = await resumeContent.ReadAsByteArrayAsync();
                    var file = Convert.ToBase64String(resume);
                    msg.AddAttachment("test.pdf", file);
                }
    
               return req.CreateResponse(HttpStatusCode.OK);
            }
    

    但我不知道如何从请求中获取文件并发送到电子邮件?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Imran Ahmad Shahid    6 年前

    以下是我使用azure临时存储作为路径的解决方案。

     public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", "options", Route = null)]HttpRequestMessage req, TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");
            if (!req.Content.IsMimeMultipartContent())
            {
                return req.CreateErrorResponse(HttpStatusCode.BadRequest,new Exception("UnSupported Meida Type"));
            }
    
            var provider = new MultipartFormDataStreamProvider(Path.GetTempPath());
    
            try
            {
                // Read the form data.
                await req.Content.ReadAsMultipartAsync(provider);
    
    
            }
            catch (System.Exception e)
            {
                return req.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
            }
    
            var formData = provider.FormData;
    
            var apiKey = "apiEkey";
            var client = new SendGridClient(apiKey);
            var from = new EmailAddress("no_reply@domain.com", "Auto Generated");
            var subject = "Application for " + formData["position"];
            var to = new EmailAddress("toemail", "Admin");
            var plainTextContent = subject;
            var htmlContent = $"<strong>First Name :</strong> {formData["firstname"]}<br><strong>Last Name :</strong> {formData["lastname"]}<br><strong>Phone Number :</strong> {formData["phonenumber"]}<br><strong>Email :</strong> {formData["email"]}";
            var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
    
            foreach (MultipartFileData file in provider.FileData)
            {
                var bytes = File.ReadAllBytes(file.LocalFileName);
                var fileBase64 = Convert.ToBase64String(bytes);
                string fileName = file.Headers.ContentDisposition.FileName;
                if (fileName.StartsWith("\"") && fileName.EndsWith("\""))
                {
                    fileName = fileName.Trim('"');
                }
                msg.AddAttachment(fileName, fileBase64);
            }
    
            client.SendEmailAsync(msg);
    
    
    
    
           return req.CreateResponse(HttpStatusCode.OK);
        }