路径中存在非法字符

3

尝试上传一个Word文档,然后将其附加到发送的电子邮件中。

目前遇到了IO异常 - 路径中有非法字符。

以下是代码:

try
{
    var fileName = Path.Combine(Server.MapPath("/"), ResumeUpload.FileName);

    ResumeUpload.SaveAs(fileName);

    using (var resumeContent = new StreamReader(fileName))
    {
        while (!resumeContent.EndOfStream)
        {
            var emailAttachement = new Attachment(resumeContent.ReadToEnd());
            message.Attachments.Add(emailAttachement);
        }
    }

    var client = new SmtpClient();
    client.Send(message);
}
catch(Exception exception)
{
    // Handle exception...
}

目前,fileName变量被设置为:

d:\sites\websitename\website.com.au\home\filename.docx

有任何想法为什么会出现问题?

以下是异常信息:

Illegal characters in path.   at System.IO.Path.CheckInvalidPathChars(String path)
  at System.IO.Path.GetFileName(String path)
  at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
  at System.Net.Mail.AttachmentBase.SetContentFromFile(String fileName, String mediaType)
  at System.Net.Mail.Attachment..ctor(String fileName)
  at JobApplication.JobApplication.SendEmail(StringBuilder emailText)

代码在 ResumeUpload.SaveAs() 这一行出错了吗? - Neil Knight
那个路径应该没问题,我正在尝试将文件保存到该路径,然后使用StreamReader从中读取并作为附件附加到电子邮件中。现在会在问题中包含异常信息... - timothyclifford
@Ardman,据我所知,它在尝试实例化流阅读器时失败了? - timothyclifford
1
使用用户提供的文件名可能是应该避免的。有人会上传“index.html”... - Tom
4个回答

4

Attachment(string)接受路径的字符串。 StreamReader.ReadToEnd返回字符串内容。我猜你只是想要:

Attachment emailAttachement = new Attachment(filename);
message.Attachments.Add(emailAttachement);

或者,使用接受Stream和名称/内容类型的构造函数。请注意,如果允许用户上传任意文件到Web服务器的根目录中,则需要考虑一些事情;我会尽量避免将它们写入磁盘(除非您想要它们进行存档),并且我不会将它们写入我的Web根目录。


3

new Attachment 需要文件名,而不是内容。

编辑:堆栈跟踪清楚地给出了提示。请使用它 :)


我试图使用接受流的附件构造函数,但是.ReadToEnd返回一个字符串...谢谢 - timothyclifford

1

试着使用这个代替

message.Attachments.Add(
    new Attachment(
        new MemoryStream(ResumeUpload.FileBytes), "attachmentName.ext"
        )
    );

这将获取上传的字节并将它们转换为流。稍后应该释放该流。


1

如果有人感兴趣,我已经让它工作了,这就是最终的效果:

ResumeUpload.PostedFile.SaveAs(Path.Combine(Server.MapPath("/"), "resumes", ResumeUpload.FileName));

var emailAttachement = new Attachment(Path.Combine(Server.MapPath("/"), "resumes", ResumeUpload.FileName));
message.Attachments.Add(emailAttachement);

using (var client = new SmtpClient())
{
    client.Send(message);
}

感谢大家的帮助 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接