PDA

View Full Version : مشکل در ذخیره فایل docx با پیشوند فارسی



amirjalili
یک شنبه 09 خرداد 1389, 12:21 عصر
با سلام.
بنده از نامه ای که در سایت دریافت کردم یک فایل docx میسازم و پیشوند اون رو برابر موضوع نامه قرار میدم.بعد zip میکنم و بعد فرد گزینه save مرورگر باز میشه و فرد میتونه نامه ای رو که دریافت کرده ذخیره کنه.
حال فرض کنید موضوع نامه "سلام" باشه. در این صورت فایل به صورت docx.سلام ذخیره میشه. اینجا مشکل به وجود میاد و اصلا نمیتونه زیپ کنه و ذخیره کنه.
اینم کد :



string name = string.Format("{0:00}_{1}_{2}.docx" , i + 1 , Mafk.Classes.Shamsi.ToShamsi(em.SendDate),em.Code. ToString());
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"[\/:\*\?""<>|]");
name = regex.Replace(name , "").Replace(" " , "_");
sb.AppendLine(string.Format("{0}\t{1}\t\t{2}" , name , em.Code , em.Subject));
Uri _uri = new Uri("/" + name, UriKind.Relative);
string contentType = System.Net.Mime.MediaTypeNames.Text.RichText;
contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
byte[] fileBytes = File.ReadAllBytes(_word);
PackagePart newFilePackagePart = _zipFile.CreatePart(_uri , contentType , CompressionOption.SuperFast);
newFilePackagePart.GetStream().Write(fileBytes , 0 , fileBytes.Length);
File.Delete(_word);



در قسمت

PackagePart newFilePackagePart = _zipFile.CreatePart(_uri , contentType , CompressionOption.SuperFast);
newFilePackagePart.GetStream().Write(fileBytes , 0 , fileBytes.Length);



خطای زیر رو میده که میگه uri مقدارش نادرسته.


Part URI is not valid per rules defined in the Open Packaging Conventions specification.


چطور میشه مشکل رو حل کرد؟
ممنون

amirjalili
یک شنبه 09 خرداد 1389, 14:06 عصر
خوب درست شد فقط بعد از اینکه utf8 میشه به جای سلام مینویسه

%D8%B3%D9%84%D8%A7%D9%85
دلیلش چیه؟

Behrouz_Rad
یک شنبه 09 خرداد 1389, 14:46 عصر
به متد UrlDecode پاسش بده.

amirjalili
یک شنبه 09 خرداد 1389, 17:44 عصر
ممنون اما با توجه به کدی که بالا گذاشتم واقعا هر چی تلاش کردم که بفهمم کجا باید به UrlDecode پاسش بدم نفهمیدم.. تو حالت عادی مشکلی باهاش ندارم اما تو این سورس به کمک احتیاج دارم واسه این کار.
باز هم ممنون

Behrouz_Rad
یک شنبه 09 خرداد 1389, 20:48 عصر
روی این قضیه بیشتر وقت گذاشتم... ابتدا جا داره که از شما تشکر کنم چون بنده رو یاد مشکلی که الان داشتید در یک پروژه ی قدیمی انداخت که اون موقع به روش وصله پینه ای مشکل رو بر طرف کرده بودم.
الان دقیق تر بررسی کردم.

Header ارسالی برای نام فایل در IE و مرورگرهای غیر IE به شکل متفاوت پردازش میشه در نتیجه Encode کردن نام فایل در حالتی که فارسی باشه متفاوت هست.
برای IE باید نام فایل رو یک بار از متد UrlEncodeUnicode بگذرونی و سپس از متد UrlDecode اما برای مرورگرهای غیر IE فقط عبور از UrlDecode کافی هست.

در نهایت کدی که نوشتم به شکل ذیل شد:



string myAgent = Request.UserAgent;
string fileName = "%d8%b3%d9%84%d8%a7%d9%85+%d8%b9%d8%b2%db%8c%d8%b2% d9%85";
string p = HttpUtility.UrlEncodeUnicode(fileName);

if (myAgent.ToLower().IndexOf("msie") != -1)
{
p = HttpUtility.UrlDecode(p) + ".docx";
}
else
{
p = (HttpUtility.UrlDecode(fileName) + ".doc").Replace(" ", "+");
}

Response.ContentType = "application/vnd.ms-word";
Response.AddHeader("Content-Disposition", "attachment; filename=" + p);

Response.TransmitFile("C:\\MyFile.docx");
Response.End();

موفق باشید.

irantopweb
دوشنبه 10 خرداد 1389, 17:58 عصر
سلام
من یه مشکلی دارم اونم اینه که اگه به جای attachment بزاریم inline اون موقع چی کار کنیم که اسم فایل پس از save فارسی بشه چون مثلا به صورت _____2~2.JPG می خواد save بشه
ممنون می شم کسی راهنمایی کنه
توی حالت attachment مشکلی نداره