Gmail API - Как извлечь текст и файлы из многокомпонентных данных? - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу извлечь как текст, так и файлы из данных формы запроса, чтобы прикрепить их к моему черновику письма.На стороне клиента я использую FormData, чтобы содержать файлы и текстовое тело для отправки на сервер.В коде сервера я использую MultipartMemoryStreamProvider для извлечения файлов из Contents и прикрепления к черновому тексту, но я не знаю, как извлечь из него текст.Я собираюсь перейти на MultipartFormDataStreamProvider, который имеет свойства FileData и FormData, но я не знаю, что заполнить RootPath.

Есть ли способдля меня, чтобы извлечь файлы и текст из данных составной формы и создать черновик почты с файлами или текстом без необходимости писать разные функции создания черновика для каждого случая?

Вот функция создания черновика на сервере:

[HttpPost]
[Route("createDraft")]
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
public async Task<IHttpActionResult> CreateDraft(CancellationToken cancellationToken)
{

    var service = await GoogleApis.GetGmailService(this, cancellationToken);
    if (service == null)
    {
        return BadRequest("Haven't signed in google apis.");
    }
    MailMessage mailMessage = new MailMessage();
    Draft draft = new Draft();
    try
    {
        var provider = new MultipartMemoryStreamProvider();
        await Request.Content.ReadAsMultipartAsync(provider);

        // extracting files
        foreach (var file in provider.Contents)
        {
            Attachment attachedFile = new Attachment(await file.ReadAsStreamAsync(), file.Headers.ContentDisposition.FileName);
            mailMessage.Attachments.Add(attachedFile);
        }

        mailMessage.Body = "abc" // <-- fill extracted text here

        MimeMessage mimeMessage = MimeMessage.CreateFromMailMessage(mailMessage);
        Message message = new Message
        {
            Raw = Encode(mimeMessage.ToString())
        };
        draft.Message = message;
        var newDraft = service.Users.Drafts.Create(draft, "me").Execute();

        return Ok(provider.Contents);
    }
    catch (Exception e)
    {
        return BadRequest(e.Message);
    }
}

Создать черновую функцию на клиенте:

createDraft() {
    var fd = new FormData();
    for (let i = 0; i < this.selectedFiles.length; i++) {
        var f = this.selectedFiles[i];
        fd.append("files", f, f.name);
    }

    fd.set('body', this.htmlBody); // <-- draft body
                                   // htmlBody: text from input field

    if (this.recipientsTo.length > 0) {
        this.isLoadingResults = true;
        this.mailService.createDraft(fd).subscribe(result => {
            this.isLoadingResults = false;
            this.dialogRef.close();
        }, error => {
                console.error(error);
        });
    }
    else {
        this.isLoadingResults = false;
        this.dialogRef.close();
    }
}

Почта создать черновой сервис:

createDraft(draftBody) {
    return this.http.post('/api/emails/createDraft', draftBody);
}
...