代码之家  ›  专栏  ›  技术社区  ›  Brother Eye

Gmail API-如何从多部分表单数据中同时提取文本和文件?

  •  0
  • Brother Eye  · 技术社区  · 7 年前

    我想从请求的表单数据中提取文本和文件以附加到我的草稿邮件正文。在客户端,我使用 FormData 包含要发送到服务器的文件和文本正文。在服务器代码中,我使用 MultipartMemoryStreamProvider 从它的 Contents 附在草案上,但我不知道如何从中提取文本。我要去 MultipartFormDataStreamProvider ,其中 FileData 表格数据 要使用的属性,但我不知道要填写什么 RootPath .

    有没有办法从多部分表单数据中提取文件和文本,并用文件或文本创建邮件草稿,而不必为每种情况编写不同的创建草稿函数?

    以下是服务器上的create draft函数:

    [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);
    }
    
    0 回复  |  直到 7 年前