2010-11-03 3 views
2

Попытка загрузить документ документа, а затем прикрепить его к электронному письму, которое отправлено.Незаконные символы в пути

В настоящее время получение исключения 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... 
} 

В настоящее время переменная имя_файла становится значение:

D: \ сайтов \ WebSiteName \ website.com.au \ дом \ 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) 
+0

и что, как ожидается путь? – Andrey

+0

Не работает ли код в строке ResumeUpload.SaveAs()? –

+0

, что путь должен быть точным, я пытаюсь сохранить файл на этом пути, а затем читать его с помощью streamreader и прикреплять к электронной почте в качестве прикрепления. будет включать в себя исключение, о котором идет речь сейчас ... – timothyclifford

ответ

3

Attachment(string) принимает строку пути. StreamReader.ReadToEnd возвращает строку содержание. Я подозреваю, что вы просто хотите:

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

В качестве альтернативы, используйте конструктор, который принимает Stream и имя/content-type. Обратите внимание, что есть несколько вещей, которые следует учитывать, если вы позволяете людям загружать произвольные файлы в корень вашего веб-сервера; Я постараюсь избежать необходимости записывать их на диск (если вы не хотите их для архива), и я бы не писал их в свой веб-корень.

2

new Attachment требует имя файла, а не содержание.

Редактировать: Стекловатка четко дает этот намек. Используйте его :)

+0

Я пытался использовать конструктор Attachment, который принял Stream, но .ReadToEnd возвращает строку ... Спасибо – timothyclifford

1

Try прикрепление с этим вместо

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

Это займет байты, загруженные и сделать поток с ними. Поток должен быть удален позже.

0

Если кто-то заинтересован, я получил это работает, и это, как это в конечном итоге ищет:

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); 
} 

Спасибо за помощь :) всяких

Смежные вопросы