Как отправить блоб с помощью angularjs и получить блоб в C # для отправки по электронной почте - PullRequest
0 голосов
/ 03 октября 2018

Я хочу опубликовать свое изображение, захваченное html2canvas, на свой контроллер c #, получить его и вставить в тело письма, готового к отправке.

Я пытаюсь использовать angularjs для публикации большого двоичного объекта, который былпреобразован из base64, возвращенного функцией html2canvas toDataURL ().Я считаю, что, возможно, я должен опубликовать его как FormData (), чтобы в c # я мог получить его и восстановить его как изображение для отображения в теле письма.

После this было предложено преобразовать base64 в BLOB-объект, но "body" получен как "ноль" в c #.Получатель и тема заполнены правильно, но только тело получено как «ноль».Я попытался передать строку base64, которая объясняет функцию getEmbeddedImage в моем контроллере.Я хочу попробовать использовать FormData (), но мне не удалось найти какую-либо информацию для получения FormData () и создания большого двоичного объекта для отображения пользователю.

Angularjs:

        html2canvas($('#quoteTable')[0], {
        letterRendering: 1,
        allowTaint: true,
        width: 1600,
        height: 1800
    }).then(function (canvas) {
        img = canvas.toDataURL();

        var tempImg = img;
        var base64ImageContent = tempImg.replace(/^data:image\/(png|jpg);base64,/, "");
        var blob = $scope.base64ToBlob(base64ImageContent, 'image/png');
        //var formData = new FormData();
        //formData.append('picture', blob);
        var data = {

            recipientEmail: "sample@sample.co.uk",

            subject: "test mail",

            body: blob

        };
        $http.post('/Home/EmailQuote', JSON.stringify(data)).then(function (response) {

            if (response.data)

                $scope.msg = "Post Data Submitted Successfully!";

        }, function (response) {

            $scope.msg = "Service not Exists";

            $scope.statusval = response.status;

            $scope.statustext = response.statusText;

            $scope.headers = response.headers();

        });
        var win = window.open();
        win.document.open();

        win.document.close();
    })
        .catch(function (error) {
            /* This is fired when the promise executes without the DOM */
            alert("could not generate canvas");
        });

Inмой контроллер Я не уверен, какой тип поставить для "тела" перегрузки и как я передам его на стороне angularjs:

  [HttpPost]
    public void EmailQuote(string recipientEmail, string subject, string body)
    {
        SmtpClient client = new SmtpClient();
        client.Port = 587;
        client.Host = "smtp.gmail.com";
        client.EnableSsl = true;
        client.Timeout = 10000;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false;
        client.Credentials = new System.Net.NetworkCredential("sample@gmail.com", "password");

        MailMessage mm = new MailMessage();
        mm.From = new MailAddress("sample@sample.co.uk");
        mm.To.Add(recipientEmail);
        mm.Subject = subject;
        mm.IsBodyHtml = true;

        mm.AlternateViews.Add(getEmbeddedImage(body));
        mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;


        try
        {
            client.Send(mm);
            ViewBag.MyProperty = "Successfully sent email";
        }
        catch (SmtpException ex)
        {
            ViewBag.Message = "Exception caught: " + ex;
        }


    }

    private AlternateView getEmbeddedImage(String filePath)
    {
        LinkedResource res = new LinkedResource(filePath);
        res.ContentId = Guid.NewGuid().ToString();
        string htmlBody = @"<img src='cid:" + res.ContentId + @"'/>";
        AlternateView alternateView = AlternateView.CreateAlternateViewFromString(htmlBody, null, MediaTypeNames.Text.Html);
        alternateView.LinkedResources.Add(res);
        return alternateView;
    }

Я посмотрел на это: Как читать FormDataC # Тем не менее, мне становится неясно, когда речь идет о восстановлении большого двоичного объекта. Нужна ли мне библиотека для конструктора BLOB-объектов и каждый их атрибут задается содержимым FormData, а затем отображает эти данные в теле?

Ответы [ 2 ]

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

Я обнаружил, что с помощью ajax вы можете отправить base64, вот что я и сделал!

        img = canvas.toDataURL();

        var data = {

            recipientEmail: "sample@sample.com",

            subject: "test mail",

            body: img

        };
        $.ajax({
            url: '/Home/EmailQuote',
            type: "POST",
            dataType: 'json',
            data: data,
            success: function (response) {
                if (response.success) {
                    alert('Email sent!');
                }
            }
        });

В C # я использовал тот же старый код, но вместо mm.AlternateViews использовал приведенный ниже код.Add (getEmbeddedImage (тело));линия.

mm.Body = "<img src='" + body + "' alt='image'/>";
0 голосов
/ 03 октября 2018

Используйте модель

public class Model
{
    public string RecipientEmail { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
}

[HttpPost]
public void EmailQuote(Model model)
...