سلام
از filestream برای ایجاد فایل و ذخیره 10000 بایت اولیه در اون استفاده میکنم.
سیک رو هم بعد از ذخیره میگذارم.
و بعد استریم رو میبندم.
10000 بایت بعدی رو append میکنم و با write ذخیره میکنم.
مشکل اینجاست که فایلم رو ذخیره میکنه اما قابل خواندن نیست.
سلام
آخر عملیات FileStream رو Dispose کن تا قفل سیستم عامل از روی اون فایل برداشته بشه.
نشد متاسفانه.
کدش رو بگذاریم یه نگاه بندازی؟
بگذار
این کدشه. یه توضیح بدم:
مثلا یه فایل 100 مگابایتی ویدئو دارم. این رو اومدم تبدیل کردم به base64 . بعد هر بار 500 بایتش رو ارسال میکنم به سرور.
حالا میخوام این رو مستقیما روی سرور ذخیره و تبدیل به ویدئو کنم. (بدون ذخیره در کش و sql و ...). مستقیم.
if (System.IO.File.Exists("/001/test" + "." + fileextention)) { using (FileStream fileStream = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.None)) { for (int i = 0; i < dataArray.Length; i++) { fileStream.WriteByte(dataArray[i]); fileStream.Close(); } } } else { using (FileStream fileStream = new FileStream(fileName, FileMode.Create)) { for (int i = 0; i < dataArray.Length; i++) { fileStream.WriteByte(dataArray[i]); fileStream.Close(); } } }
گیر کردم انصافا.
ممنونم.
دلیلش اینه که fileStream رو قبل از اینکه کارش تموم بشه داری Close میکنی
خب ببین فایله 100 مگه.
هر بار 1024 بایت با آجاکس ارسال میشه سمت اکشن.
یعنی اکشنم 1000 بار rerun میشه.
اولا اینکه نمیدونم چرا اصن اینکار رو میکنی!
چون خود asp mvc واسه دانلود و آپلود فایل مکانیزم داره و خودش به صورت توکار stream فایل رو ذخیره میکنه. به هر حال شاید مورد خاصی رو داری پیاده میکنی.
ببین اون dataArray رو داری میگی که 1024 بایت هستش و توی حلقه داری بایت به بایت میخونی و ذخیره میکنی. باید ۱۰۲۴ بایت رو بخونی و در نهایت stream ٰرو ببندی نه اینکه یه بایت رو خوندی و stream رو بستی خب اینجا exception میگیری دیگه.
تو اصن نیازی به fileStream.Close نداری. زمانی که از بلاک using میاد بیرون خودکار Dispose میکنه.
اوکی شد دم شما گرم.
فقط یه مطلبی موند. مشکلم با تبدیل string دریافتی هست که base64 هستش.
الان اجبارن ازین سیکل استفاده کردم:
fileStream.Write(Convert.FromBase64String(st), 0 , Convert.FromBase64String(st).Length);
اما اگر بخوام اون استرینگ رو تبدیل به ارایه کنم و از خط کد زیر استفاده کنم بایستی چکار کنم:
for (int i = 0; i < dataArray.Length; i++) { fileStream.WriteByte(dataArray[i]); fileStream.Close(); }
یعنی به طور کلی ازین متد بالایی استفاده میکنم فایل ناخوانا میشه. اما اون بالاتریه نه. اکی شده.
ممنونم از وقتی که میگذاری.
خواهش میکنم وظیفه است.
فایل ویدئو میخوای ذخیره کنی ؟
اگه ویدئو باشه که اصلا مشکلی نداره و نیاز به تبدیل به رشته متنی نداره.
کلا فایلای حجم بالا و پایین رو...
از این خط که استفاده میکنم:
fileStream.Write(Convert.FromBase64String(st), 0 , Convert.FromBase64String(st).Length);
این باگ رو میده:
برای طول رشته ی 10000 تا... البته شایدم کمترم باشه!
Exception thrown: 'System.FormatException' in mscorlib.dll Additional information: Invalid length for a Base-64 char array or string
منم میگم اصلا چرا میخوای st رو به رشته تبدیل کنی ؟
خب همینطوری باینری ذخیره کن دیگه.
st از نوع استرینگه.
شما میگید همون بالا در ورودی اکشن به جای string اون رو byte بگذارم؟
آره بابا
باینری ذخیره کن. دلیلی نداره به رشته تبدیل کنی اصلا. کلی سربار پردازشی و رم و اینا داری اینطوری
بعد کلا ویدئو Base64String نیست که. اصلا نمیتونی تبدیلش کنی واسه همینم داری Exception میگیری
سلام
انجام دادم. استرینگ رو به بایت تبدیل کردم و
byte[] dataArray; dataArray = Encoding.ASCII.GetBytes(st);
با این خط کد:
fileStream.Write(dataArray, 0, dataArray.Length);
شروع به ذخیره کردم. ولی مجدد فایلم رو ذخیره میکنه اما سالم نیست.
سلام
بذار شب میرم خونه برات یه نمونه درست میکنم میفرستم همینجا
باشه ممنونم ازت.
سلام
اوکی شد. داده هارو بهتر بود تبدیل به بایت کنم و به سرور بفرستم.البته تنها مشکلی که این نوع سناریو داره میزان ارسال بایت به سرور هست!
مرسی
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)