Reputation: 822
I want to achieve is to post data which includes text and file from html page to azure function and then send that data to admin email. I have tried it out but now able to get posted file.
Html Page :
<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 Function
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("[email protected]", "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);
}
but i wouldn't able to do that any idea how Can I get file from request and send it to email?
Upvotes: 1
Views: 1251
Reputation: 822
so What I want to achieve is while posting file and form data to azure function get that file and data and send it to admin email through azure function without using azure blob or other storage. here is the solution for that I have used azure temporary storage for path.
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("[email protected]", "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);
}
Upvotes: 1