邮件附件无效 - 附件路径不正确

时间:2014-12-17 16:11:46

标签: jquery ajax vb.net email-attachments

这是我的工作流程:

  • 用户在填写HTML表单时选择本地文件
  • AJAX将表单数据发送到我的ASMX
  • 公共类获取JSON数据并将其用于创建电子邮件(文件为附件

是的,有关{}无效邮件附件的ton of posts。但是,我在附件的文件路径方面遇到了问题,而且我读过的帖子都没有帮助。

在我的邮件类中,我像这样创建附件(注意,数据是另一个公共类,其中File是属性):

oAttch = New MailAttachment(data.file.name)

显而易见的问题是我的附件名称不是完整路径。

我为完成这条道路所做的工作:

我认为问题是我试图在文件离开客户端后获取文件的完整路径。也许没有解决方法或修复此问题。任何建议都会很棒。如果您需要更多信息,请告诉我。

修改

关于这个主题的类似帖子,我看到了对FileReader的引用并将其添加到我的点击监听器中:

var file = $('#nuFile')[0].files[0];
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onloadend = function () {
    data.file = reader.result;
    sendEmail(data);
}

data.file创建了一个base64编码的PDF字符串,稍后将其发送到我的webservice(通过我的sendMail函数中的AJAX)。但是,现在我的webservice中的data.file是string string。

然后我创建了附件:

Dim ms As MemoryStream
If data.file IsNot Nothing Then
     ms = New MemoryStream(Encoding.UTF8.GetBytes(data.file))
     oMsg.Attachments.Add(New Attachment(ms, "NAF.pdf", "application/pdf"))
End If

电子邮件随附件一起发送,但是当我尝试打开PDF时,它说该文件已损坏。我使用this page作为创建MemoryStream的参考。此外,如果Base64编码字符串太大,它会超过JSON的限制。

也许很明显我做错了什么,但这对我来说是个新世界。希望这有帮助!

2 个答案:

答案 0 :(得分:1)

您的.asmx可以为给定文件生成GUID,并将文件保存到文件系统,数据库,会话或使用GUID作为键的任何位置。 GUID将返回给客户端。

将httphandler(ashx)添加到解决方案中,该解决方案接收文件GUID,访问文件,将其转换为bytearray,然后将其写入响应,例如。

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest

    context.Response.Clear()
    context.Response.ContentType = GetResponseContentType(FileExtension)
    context.Response.AddHeader("content-disposition", "attachment; filename=FileName.FileExtension")
    Dim btyearray As Byte()
    btyearray = YourFileAsAMemoryStream.ToArray
    context.Response.BinaryWrite(btyearray)
    YourFileAsAMemoryStream.Dispose()
    context.Response.Flush()
    context.Response.End()

End Sub

Public Function GetResponseContentType(ByVal fileExtension As String) As String

    Dim strExtension As String = fileExtension.ToLower
    strExtension = Replace(strExtension, ".", "")
    Select Case strExtension
        Case "bmp"
            Return "image/bmp"
        Case "jpg", "jpeg"
            Return "image/jpeg"
        Case "png"
            Return "image/png"
        Case "gif"
            Return "image/gif"
        Case "htm", "html"
            Return "text/HTML"
        Case "xml"
            Return "text/xml"
        Case "txt"
            Return "text/plain"
        Case "doc", "rtf", "docx"
            Return "application/msword"
        Case "csv", "xls"
            Return "Application/x-msexcel"
        Case "pdf"
            Return "application/pdf"
        Case Else
            Return "text/plain"
    End Select

End Function

这将允许你做这样的事情:

<img src="myImageHandler.ashx?fileGuid=MyFileGUID" />

我知道这不是一个完整的答案,我没有时间为此逐步提供完整的解决方案,但如果您感兴趣,这会给出一条路线。

答案 1 :(得分:0)

我相信你的问题在于你在客户端上获取文件的路径并将其发送到没有相同路径的文件的服务器。最好的办法是不使用文件的路径,而是使用Attachment的一个重载并将其作为流发送。我以前用PDF和Winforms应用程序完成了这个,但我不知道你在JSON中遇到二进制数据会遇到什么问题。

希望这至少让你指向正确的方式。