File Download med Response.BinaryWrite
Hej,
Laddar ner en kalenderfil till Outlook genom response.binarywrite, men kan inte få encodingen att visa svenska tecken inuti filen.
<code>
string FileSessionId = objCal.CreateICS(EventCalendar.SelectedDate);
string FilePath = Server.MapPath("/events/ics/" + FileSessionId + ".ics");
// Skicka kalenderfilen till besökaren
FileStream objFS = new FileStream(FilePath, FileMode.Open);
long FileSize = objFS.Length;
byte[] Buffer = new byte[(int)FileSize];
objFS.Read(Buffer, 0, (int)objFS.Length);
objFS.Close();
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", "filename=" + FileSessionId + ".ics");
Response.BinaryWrite(Buffer);
</code>
Kalenderfilen ser ut så här i ren text:
<code>
BEGIN:VCALENDAR
VERSION:1.0
BEGIN:VEVENT
DTSTART:20051102T230000Z
DTEND:20051103T200000Z
LOCATION;ENCODING=QUOTED-PRINTABLE:Sverige
DESCRIPTION;ENCODING=QUOTED-PRINTABLE:Hej hej
SUMMARY;ENCODING=QUOTED-PRINTABLE:Här kommer ett event
TRIGGER:-PT15M
PRIORITY:3
END:VEVENT
END:VCALENDAR
</code>
Om man tittar i kalenderfilen ser man att det finns svenska tecken i "Här", men dessa visas som ä när man visar den i Outlook.
Någon som vet hur man sätter rätt encoding för detta?
Svara
Sv: File Download med Response.BinaryWrite
Något kul med encoding; hittade en tråd som kan vara intressant: http://www.dotnet247.com/247reference/msgs/43/217592.aspx
Svara
Sv:File Download med Response.BinaryWrite
OK Cool Cat!
Lyckades fixa det. Problemet låg ju inte i hur jag skickade filen utan hur jag skapade den.
Funktionen för att skapa filen:
Nyckelraden är "TextWriter tw = new StreamWriter(FilePath, false, Encoding.Default);"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | // SKAPA EN KALENDERFIL OCH SKICKA TILL BESÖKAREN /////////////////////////////////////////////// // Returnerar en sträng med det unika filnamnet public string CreateICS(DateTime SelectedDate) { string subject = "" ; string summary = "" ; string startDate = "" ; string startTime = "" ; string endTime = "" ; string location = "" ; // Hämta data DataSet objDS = DSGetEventByDate(SelectedDate.ToShortDateString().ToString()); DataRowCollection objRow = objDS.Tables[0].Rows; if (objRow.Count != 0) { foreach (DataRow drRow in objRow) { subject = drRow[ "Header" ].ToString(); summary = drRow[ "Bodytext" ].ToString(); startDate = drRow[ "EventDate" ].ToString(); startTime = drRow[ "EventStart" ].ToString(); endTime = drRow[ "EventEnd" ].ToString(); location = drRow[ "EventLocation" ].ToString(); } } const string c_strTimeFormat = "yyyyMMdd\\THHmmss\\Z" ; string strStartTime = "" ; string strEndTime = "" ; string strTimeStamp = "" ; string strTempStartTime = "" ; string strTempEndTime = "" ; string vCalendarFile = "" ; // Definera VCalendar format const string VCAL_FILE = "BEGIN:VCALENDAR\n" + "VERSION:1.0\n" + "BEGIN:VEVENT\n" + "DTSTART{0}\n" + "DTEND{1}\n" + "LOCATION;ENCODING=QUOTED-PRINTABLE:{2}\n" + "DESCRIPTION;ENCODING=QUOTED-PRINTABLE:{3}\n" + "SUMMARY;ENCODING=QUOTED-PRINTABLE:{4}\n" + "TRIGGER:-PT15M\n" + "PRIORITY:3\n" + "END:VEVENT\n" + "END:VCALENDAR" ; // Formatera innehållet rätt DateTime dtmStartDate = DateTime.Parse(startDate.ToString()); DateTime dtmStartTime = DateTime.Parse(startDate.Substring(0, 10) + " " + startTime.ToString()); DateTime dtmEndTime = DateTime.Parse(startDate.Substring(0, 10) + " " + endTime.ToString()); strTempStartTime = string .Format( "{0} {1}" , dtmStartDate.ToShortDateString(), dtmStartTime.ToLongTimeString()); strTempEndTime = string .Format( "{0} {1}" , dtmStartDate.ToShortDateString(), dtmEndTime.ToLongTimeString()); strTimeStamp = (DateTime.Parse(strTempStartTime)).ToUniversalTime().ToString(c_strTimeFormat); strStartTime = string .Format( ":{0}" , strTimeStamp); strEndTime = string .Format( ":{0}" , (DateTime.Parse(strTempEndTime)).ToUniversalTime().ToString(c_strTimeFormat)); // Definera kalenderinnehållet vCalendarFile = String.Format(VCAL_FILE, strStartTime, strEndTime, location, summary, subject, strTimeStamp, "Text här" ); // Instansiera texstrean objektet string FilePath = Server.MapPath( "/events/ics/" + Session.SessionID.ToString() + ".ics" ); TextWriter tw = new StreamWriter(FilePath, false , Encoding.Default); // Skriv innehållet till filen tw.WriteLine(vCalendarFile.ToString()); // Stäng filen tw.Close(); return Session.SessionID.ToString(); } |
Och så här anropar jag funktionen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | // Skicka kalenderfil till besökaren ////////////////////////////////////////////////// public void GetCalendarFile(Object sender, EventArgs e) { CalendarClass objCal = new CalendarClass(); string strStartDate; string strStartTime; string strEndTime; string strHeader; string strSummary; string strLocation; string strOrganizerMail; // Skapa kalenderfilen string FileSessionId = objCal.CreateICS(EventCalendar.SelectedDate); string FilePath = Server.MapPath( "/events/ics/" + FileSessionId + ".ics" ); Response.Clear(); Response.ContentType = "text/plain" ; Response.ContentEncoding = Encoding.UTF8; Response.AddHeader( "Content-Disposition" , "attachment; filename=" + FileSessionId + ".ics" ); Response.WriteFile(FilePath); Response.Flush(); Response.Close(); // Ta bort filen FileInfo objFI = new FileInfo(FilePath); objFI.Delete(); } |
Svara