2017-04-18 3 views
1

안녕하세요. 전자 메일에 첨부 파일을 추가하려하지만이 이상한 예외가 발생합니다. 내가 파일 입력 양식에서 첨부 파일을 얻고있다System.Mail.Net은 닫힌 파일에 액세스 할 수 없습니다. 첨부 파일을 추가하려고 시도 할 때 예외가 발생했습니다.

<div class="form-group"> 
<br/> 
Select any files to attach to email 
<div class="input-group"> 
    <label class="input-group-btn btn btn-default btn-file" id="attachFiles"> 
     Upload <input type="button" id="attach" name="Upload" style="display: none" value="Upload"/> 
    </label> 
    <label class="input-group-btn btn btn-default btn-file"> 
     Browse <input type="file" id="attachInput" multiple="false" style="display: none"/> 
    </label> 
    <input type="text" disabled="disabled" id="attachText" class="form-control input-group-addon"/> 
</div> 
<br/> 
<ul id="issueFormAttachName" class="list-group list-inline"></ul> 

그리고 내가 요청을 통해이 파일을 받고 다른 컨트롤러

[HttpPost] 
    [Route("home/saveAttachment")] 
    public ActionResult SaveAttachment() 
    { 
     try 
     { 
      EmailAttachments = new EmailAttachments 
      { 
       FileCollectionBase = Request.Files 
      }; 
      return Json("Ok"); 
     } 
     catch (Exception ex) 
     { 
      return Json("Error occurred. Error details: " + ex.Message); 
     } 
    } 

을 통해 나중에 액세스하기 위해 공용 변수에 저장하고 이 후 내 컨트롤러에 전화를 걸어이 파일을 사용하여 이메일을 보내십시오.

string usersToReceived = ""; 
      EmailMessage email = new EmailMessage 
      { 
       InnerHtmlBody = emailDto.EmailBody, 
       Subject = $"Support enquiry ticket number #{issueId}", 
       EmailHeader = "Thank you for contacting support" 
      }; 
      emailDto.Users.ForEach(u => usersToReceived += u + ";"); 


      Dictionary<string, Stream> streams = new Dictionary<string, Stream>(); 

      //Check if attachments exist 
      if (HomeController.EmailAttachments?.FileCollectionBase.Count > 0) 
      { 

       foreach (string streamName in HomeController.EmailAttachments.FileCollectionBase) 
       { 
        streams.Add(streamName, HomeController.EmailAttachments.FileCollectionBase[streamName].InputStream);  
       } 
       foreach (string file in HomeController.EmailAttachments.FileCollectionBase) 
       { 
        //make sure stream is not disposed untill send is done 
        //Streams dont need to be explicitly disposed 
        email.AddAttachment(streams[file], file, HomeController.EmailAttachments.FileCollectionBase[file]?.ContentType); 
       } 
      } 

      email.Send(usersToReceived); 

    } 

첨부 파일 추가 방법은 ca LLS 기본 첨부 파일 생성자 (New Attachment(_ms, fileName, mediaType) 이제

때로는 여기에 무슨 무슨 난 내 캐시를 지우고이 작동하지만 대부분의 시간이 오류와 예외가 폐쇄 파일 누구나 알고에 액세스 할 수 없습니다 발생합니다 위의 코드를 사용하려고하면? 난 끝에 캐시 지우기 방법을 가지고 노력 않았지만이

+2

귀하의 첨부 파일은 MVC 파이프 라인으로 사망합니다. Request.Files 콘텐츠를 다른 ICollection 변수로 다시 쓰고 저장하면 매력처럼 작동합니다. –

+0

고마워 할 것입니다 – Harry

+0

안녕하세요 다른 질문 언제 내가 Request.Files의 시점에서 그들을 다시 작성해야합니까 아니면 나중에 전화를하기 전에? 왜냐하면 내 앱이 MVC 파이프 라인을 벗어나는 곳을 알지 못하기 때문이다. – Harry

답변

1

를 작동하지 않았다 그것의 asp.net mvc pipeline 트릭 :

컨트롤러의 각 조치가 반사에 의해 호출, 그래서 그들은 파이프 라인이 다른 있습니다. 당신이 정적 변수에 처음 저장 Request.Files에서

-가 사용할 수 만 파이프 라인 죽지있다.

다음으로 다른 동작을 호출하고 요청 변수가 달라야이므로 더 이상 Files 속성을 저장하지 않습니다.

이를 방지하려면 데이터베이스, 정적 변수 또는 그와 유사한 것을 요청 사이에 저장해야합니다.

관련 문제