• توجه: در صورتی که از کاربران قدیمی ایران انجمن هستید و امکان ورود به سایت را ندارید، میتوانید با آیدی altin_admin@ در تلگرام تماس حاصل نمایید.

ارسال (Upload) فایل به سرور در ASP.NET

admin

Administrator
عضو کادر مدیریت
در بسیاری از Web Applicationها نیاز به ایجاد امکان Upload فایل به سرور به صورت کنترل شده و بدون نیاز به برقراری دسترسی از طریق FTP و… می باشد. انجام این کار در ASP.NET بسیار ساده است. در این مقاله سعی شده است از دیدگاه کاربردی و نه آزمایشگاهی به این مطلب نگریسته شود. به طوری که کلیه مراحل جهت ذخیره فایل روی Remote Server می باشد و نه Localhost. کدنویسی شامل دو قسمت می باشد:

  • کدهای مربوط به Presentation Layer و یا همان صفحات aspx. که مورد مشاهده کاربر قرار می گیرد.
  • کدهای مربوط به Business Login Layer که همان Code Behind و Handlerهای صفحه می باشند که در این مقاله به زبان VB.NET نوشته شده است.
برای این کار ابتدا بایستی یک وب فرم درون Application خود ایجاد کرده سپس در درون تگ <form> تگ زیر را اضافه کنید:
<input id=”filename” type=”file” runat=”server”>
ویژگی type=”file” نشاندهنده این است که ما با یک فیلد معمولی متنی سر و کار نداریم.
دو نکته مهمی که باید در اینجا مدنظر قرار گیرند عبارتند از:

  • فراموش نکنید که ویژگیهای runat=”server” و enctype=”multipart/form-data” حتما در تگ <form> تنظیم شوند.
  • تگ <input> شما نیز باید خاصیت runat=”server” را داشته باشد تا بتوانیم از طریق ASP.NET آن را کنترل کنیم.
قرار دادن تگ <input> در صفحه شما یک فیلد متنی و یک دکمه …Browse برای شما ایجاد می کند که با کلیک کردن روی آن پنجره ای جهت انتخاب فایل از روی سخت دیسک شما باز می شود و پس از انتخاب فایل و تایید مقدار Value فیلد متنی با مسیر فایل روی سخت دیسک شما جایگزین می شود.
حال بایستی فایل انتخاب شده به سرور منتقل شود برای اینکار یک کنترل Button به صفحه اضافه می کنیم که با کلیک کردن روی آن فایل به سرور منتقل شود:
<asp:Button id=”UploadButton” runat=”server” Text=”Upload” />
در حال حاضر صفحه Presentation آماده است و بایستی در Code Behind صفحه و یا Block Script رویداد کلیک روی دکمه Upload را کنترل نماییم. (ما در اینجا از Code Behind استفاده کرده ایم و تنها قسمت مربوط به Event Handling ذکر شده اما در فایل ضمیمه مقاله کل Code Behind را می توانید بیابید)
کد:
Private Sub UploadButton_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles UploadButton.Click
 If Not (filename.PostedFile.FileName.Length = 0) Then
    Dim ServerPath As String = "C:\YourWebSite\YourFolder" &
Mid(filename.PostedFile.FileName, InStrRev(filename.PostedFile.FileName, "\",
-1, 1), filename.PostedFile.FileName.Length)
    filename.PostedFile.SaveAs(ServerPath)

    filename.Visible = False
    UploadButton.Visible = False
    lblError.Visible = False
    lblSendMessage.Visible = True
    lblSendMessage.Text = "فایل شما به سرور منتقل شد.";
  Else
    lblError.Visible = True
  End If
End Sub

کد بالا پیچیدگی چندانی ندارد اما جهت رفع هرگونه ابهام برخی قسمتهای آن را توضیح می دهیم: در حلقه شرطی ابتدا خاصیبت PostedFile که به فایل مورد انتقال اشاره می کند مورد بررسی قرار می گیرد و چنانچه طول نام فایل برابر صفر نباشد (یعنی فایلی انتخاب شده باشد) آنگاه با استفاده از متد SaveAs فایل را روی سرور ذخیره می کند. نکته ای که این جا مطرح است این است که با استفاده از توابع Mid و InStrRev تنها قسمت انتهایی مسیر فایل روی سخت دیسک شما (یعنی \filename.ext) دریافت شده و به انتهای مسیر فیزیکی Server شما می چسبد تا فایل مزبور با همان نام روی Server ذخیره شود. شما می توانید مسیر فیزیکی سرور خود را با ساختن یک فایل ساده مثل ShowPath.aspx و قرار دادن دستور زیر پیدا کنید.
<% Response.Write(Server.MapPath(“ShowPath.aspx”)) %>
چنانچه شما فایلهای ضمیمه این مقاله را بررسی کنید خواهید دید که چندین Label Control جهت اطلاع رسانی به کاربر جهت انتخاب فایل پیش از کلیک بر روی دکمه Upload و نیز پس از ارسال فایل قرار داده شده است. ویژگی Visible که در این قسمتها مورد استفاده قرار گرفته است باعث می شود تا پیغام فوق تنها در زمان مقتضی نمایش و حتی فرمها نیز پس از ارسال محو شوند.
نکته دیگری که بایستی حتما مد نظر قرار دهید این است که مقدار maxRequestLength را که در واقع حجم فایل ارسالی را محدود می کند تنظیم کنید. برای این کار در فایل web.config خود و در قسمت <system.web> تگ زیر را اضافه کنید:
<httpRuntime maxRequestLength=”50000″ />
عدد فوق بر حسب بایت می باشد و در این مثال حجم فایل ارسالی حداکثر ۵۰ کیلوبایت در نظر گرفته شده است. چنانچه شما می خواهید در این زمینه نیز محدودیتی را برای کاربران خود اعمال کنید بایستی در یک حلقه شرطی ویژگی filename.PostedFile.ContentLength را نیز کنترل کنید.


منبع: دارد-نامشخص
 

admin

Administrator
عضو کادر مدیریت
کدهای مربوط به Upload کردن فايل به سرور را بايد به دو قسمت تقسيم نمود. قسمت اول شامل کدهايی است که نحوه نمايش در مرورگر را شامل می شوند و اساس آن بر HTML است. و قسمت دوم مربوط به طرف سرور است که شامل کدهايی است که با ASP.NET نوشته می شوند. برنامه زير حاوی کدهای مربوطه برای انجام اين کار به صورات خيلی ساده و ابتدايی می باشد. همانطور که ملاحظه می کنيد برخلاف ASP کلاسيک، نياز به وجود component خاصی نمی باشد و اين کار در ASP.NET بصورت خيلی ساده انجام پذير است.
کد:
Upload.aspx:
<HTML>
<HEAD>
<TITLE>Uploading File...</TITLE>
<Script language="vb" runat="server">
sub page_load(s as object,e as EventArgs)
    If Not (MyInputFile.PostedFile Is Nothing) Then
        MyInputFile.PostedFile.SaveAs("c:\filename.ext")
        Response.write("Your File was saved on the server...")
    End If 
end sub
</script>
</HEAD>
<BODY>
    <FORM method="post" encType="multipart/form-data">
        <input id="MyInputFile" type="file" name="MyInputFile" runat="server"> 
        <input type="submit" value="Submit">
    </FORM>
</BODY>
</HTML>
در زير به شرح و توضيح برنامه بالا می پردازيم:
کدهای مربوط به طرف Client
به دليل آنکه در اين قسمت، ارسال اطلاعات به سرور را داريم، بايد کدهای مربوطه درون يک فرم قرار گيرند. اما لازم است که ويژگی encType آن فرم را به صورت زير مقدار دهی کنيم، زيرا در غير اينصورت فايل انتخاب شده توسط کاربر به سرور ارسال نخواهد شد:
کد:
encType="multipart/form-data"

در HTML کنترلی وجود دارد که وظيفه دريافت نام فايل و ارسال آن به سرور را عهده دار می باشد:
کد:
<input id="MyInputFile" type="file" name="MyInputFile" runat="server">

توجه کنيد که اين کنترل را به صورت يک سرور کنترل در می آوريم تا بتوانيم در ASP.NET از توانايی های آن استفاده نماييم و به همين دليل ويژگی runat="server" را به کنترل مربوطه اضافه کرده ايم. بنابراين کد مربوط به قسمت Client به صورت زير خواهد بود:
کد:
<body>
<form method="post" encType="multipart/form-data">
<INPUT id="MyInputFile" type="file" name="MyInputFile" runat="server">
<input type="submit" value="Submit">
</form>
</body>
کدهای مربوط به طرف Server
اين قسمت کدهايی را شامل می شود که برای ذخيره کردن فايل بر روی سرويس دهنده مورد استفاده قرار می گيرند.همانطور که گفته شد شئ مربوط به دريافت نام فايل را به صورت سرور کنترل قرار داديم تا بتوانيم از خصوصيات آن در سرور استفاده کنيم (در اينجا نام آنرا MyInputFile درنظر گرفته ايم). يکی از خصوصيات اين شئ، شئ PostedFile می باشد که به فايل ارسالی توسط کاربر اشاره می کند. اين شئ نيز شامل متدی است که اقدام به ذخيره فايل می کند. بنابراين قبل از ذخيره کردن بايد مطمئن شد که آيا شئ PostedFile به چيزی اشاره می کند و يا اينکه تهی است. برای اين منظور کد مربوط به ذخيره سازی را در شرط زير قرار می دهيم:
کد:
If Not (MyInputFile.PostedFile Is Nothing) Then

و درصورت صحيح بودن شرط، اقدام به ذخيره سازی می نماييم. متد SaveAs شئ PostedFile دارای پارامتری است که محل و نام فايلی که قرار است بر روی سرور ذخيره شود را مشخص می کند. در انتها نيز پيغامی مبنی بر اينکه فايل با موقيت ذخيره شده است را به کاربر می دهيم.
کد:
Response.write("Your File was saved on the server successfuly...")

بنابراين کد طرف سرور به صورت زير خواهد بود:
کد:
<script language="vb" runat="server">
   sub page_load(s as object,e as EventArgs)
      If Not (MyInputFile.PostedFile Is Nothing) Then
         MyInputFile.PostedFile.SaveAs("c:\filename.ext")
         Response.write("Your File was saved on the server...")
      End If
   end sub
</script>
چند نکته
ديگر خصوصيات شئ PostedFile به صورت زير است:
• ContentLength: به اندازه فايل ارسالی اشاره ميکند.
• ContentType: MIME فايل ارسالی را مشخص می کند که در تشخيص نوع فايل دريافتی کمک می کند.
(بعضی از انواع رايج MIME عبارت اند از : text/plain ، image/gif ، image/jpeg ، audio/mpeg ، application/msword ، application/octed-stream ، video/mpeg ، audio/wav و...)
• FileName: نام فايل و مسير آن در کامپيوتر شخص کاربر را معين می کند.(مانند C:\images\personal\myface.jpg)
• InputStream: يک شئ stream که به فايل upload شده اشاره می کند و آنرا برای خواندن محتوايش آماده می سازد.

يک نکته مهم
توجه کنيد که به طور پيش فرض طول داده های ارسالی در يک request حداکثر 4096 بايت (يا همان 4 kb ) می باشد. بدين معنی که يک فايل ارسالی حداکثر می تواند 4 kb باشد. برای اينکه اين مقدار را به مقدار لازم و مورد نياز افزايش دهيد بايد در فايل web.config ويا machine.config در قسمت <system.web> در صورتيکه قسمت زير موجود نيست آنرا اضافه کنيد
کد:
<httpRuntime maxRequestLength="1000000"/>

ودر صورت وجود مقدار maxRequestLength را به مقدار دلخواه تنظيم کنيد. اين مقدار بر حسب بايت می باشد. در مثال بالا مقدار ماکزيمم فايل ارسال يک ميليون بايت (حدود 1 MGB) می باشد. به عنوان نمونه يک فايل web.config که فقط نياز فوق را برآورده سازد به صورت زير خواهد بود:
کد:
Configuration file : web.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration >
   <system.web> 
      <httpRuntime maxRequestLength="1000000" /> 
   </system.web>
</configuration>
 
بالا