سؤال

أنا باستخدام <input type="file" id="fileUpload" runat="server"> لتحميل ملف في ASP.NET التطبيق.أود أن تحد من نوع ملف التحميل (على سبيل المثال:حد .xls أو .امتداد الملف xlsx).

كل من جافا سكريبت أو التحقق من جانب الخادم موافق (طالما جانب الملقم التحقق من صحة ستجري قبل تحميل الملفات - يمكن أن يكون هناك بعض الملفات الكبيرة جدا التي تم تحميلها, لذلك أي التحقق يجب أن تتم قبل الفعلية الملفات التي تم تحميلها).

هل كانت مفيدة؟

المحلول

يبدو أنك ستكون لدينا خيارات محدودة منذ كنت تريد التحقق من أن تحدث قبل التحميل.أعتقد أن أفضل أنت ذاهب للحصول على استخدام جافا سكريبت للتحقق من صحة الملف.يمكنك بناء تجزئة صالحة امتداد ثم ننظر لنرى إذا كان امتداد الملفات التي يتم تحميلها موجودة في تجزئة.

HTML:

<input type="file" name="FILENAME"  size="20" onchange="check_extension(this.value,"upload");"/>
<input type="submit" id="upload" name="upload" value="Attach" disabled="disabled" />

جافا سكريبت:

var hash = {
  'xls'  : 1,
  'xlsx' : 1,
};

function check_extension(filename,submitId) {
      var re = /\..+$/;
      var ext = filename.match(re);
      var submitEl = document.getElementById(submitId);
      if (hash[ext]) {
        submitEl.disabled = false;
        return true;
      } else {
        alert("Invalid filename, please select another file");
        submitEl.disabled = true;

        return false;
      }
}

نصائح أخرى

انها بسيطة جدا باستخدام regulare التعبير المصادقة.

<asp:RegularExpressionValidator
id="RegularExpressionValidator1"
runat="server"
ErrorMessage="Only zip file is allowed!"
ValidationExpression ="^.+(.zip|.ZIP)$"
ControlToValidate="FileUpload1"
> </asp:RegularExpressionValidator>

التحقق من جانب العميل من أنواع الملفات المسموح بتحميلها

من جافا سكريبت, يجب أن تكون قادرة على الحصول على اسم الملف في onsubmit معالج.حتى في الحالة الخاصة بك, يجب عليك أن تفعل شيئا مثل:

<form onsubmit="if (document.getElementById('fileUpload').value.match(/xls$/) || document.getElementById('fileUpload').value.match(/xlsx$/)) { alert ('Bad file type') ; return false; } else { return true; }">...</form>

أنا أتفق مع كريس التحقق من التمديد هو عدم التحقق من نوع الملف أي الطريقة التي ننظر إليها. Telerik هو radUpload هو على الأرجح أفضل خيار ، فإنه يوفر ContentType الملكية من الملفات التي تم تحميلها والتي يمكنك مقارنة المعروف أنواع mime.يجب عليك التحقق:

application/vnd.ms-excel ،

تطبيق/excel ،

application/x-msexcel

و الجديد 2k7 الشكل:

application/vnd.openxmlformatsofficedocument.spreadsheetml.ورقة

Telerik تستخدم لبيع radUpload باعتبارها عنصر على حدة ، ولكن الآن ملفوفة في الضوابط جناح, مما يجعل من قليلا أكثر تكلفة, ولكن إلى حد بعيد أسهل طريقة للتحقق من نوع true

يمكنك استخدام التعبير العادية المصادقة على تحميل عنصر التحكم:

  <asp:RegularExpressionValidator id="FileUpLoadValidator" runat="server" ErrorMessage="Upload Excel files only." ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.xls|.XLS|.xlsx|.XLSX)$" ControlToValidate="fileUpload"> </asp:RegularExpressionValidator>

وهناك أيضا قبول سمة من المدخلات الوسم:

<input type="file" accept="application/msexcel" id="fileUpload" runat="server">

ولكن لم يكن لديك الكثير من النجاح عندما حاولت هذا (مع FF3 و IE7)

لأن بعض الناس ذكره ، جافا سكريبت هو الطريق للذهاب.نضع في اعتبارنا أن "التحقق من صحة" هنا هو إلا امتداد الملف لن التحقق من أن الملف هو حقيقي جداول البيانات إكسل!

على أساس kd7 رد أقترح عليك التحقق من الملفات نوع المحتوى ، وهنا المجمع الطريقة:

private bool FileIsValid(FileUpload fileUpload)
{
    if (!fileUpload.HasFile)
    {
        return false;
    }
    if (fileUpload.PostedFile.ContentType == "application/vnd.ms-excel" ||
        fileUpload.PostedFile.ContentType == "application/excel" ||
        fileUpload.PostedFile.ContentType == "application/x-msexcel" ||
        fileUpload.PostedFile.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" //this is xlsx format
        )
        return true;

    return false;
}

إرجاع true إذا كان ملف التحميل .xls أو .xlsx

تأكد من أنك دائما التحقق من ملف التمديد في جانب الخادم للتأكد من أن لا أحد يمكن تحميل ملف ضار مثل .aspx .asp.... الخ

حسنا أنت لن تكون قادرة على القيام بذلك من جانب الخادم في ما بعد الظهر مثل الملف سوف تحصل على المقدمة (تحميل) خلال فترة ما بعد الظهر.

أعتقد أنك قد تكون قادرة على القيام بذلك على العميل باستخدام جافا سكريبت.أنا شخصيا استخدام طرف ثالث مكون يسمى radUpload قبل Telerik.هذا من جانب العميل والخادم الجانب API يوفر شريط التقدم الكبير تحميل الملف.

أنا متأكد من أن هناك الحلول مفتوحة المصدر المتاحة أيضا.

أعتقد أن هناك طرق مختلفة للقيام بذلك.منذ ايم لم تكن مألوفة مع asp لا يسعني إلا أن أقدم لك بعض النصائح للتحقق محدد نوع الملف:

1) طريقة آمنة:الحصول على المزيد من المعلومات حول رأس نوع الملف الذي ترغب في تمرير.تحليل الملف الذي تم تحميله ومقارنة رؤوس

2) طريقة سريعة:تقسيم اسم الملف إلى قطعتين -> اسم الملف وإنهاء الملف.تحقق من إنهاء ملف ومقارنتها إلى نوع الملف الذي تريد السماح ليتم تحميلها

نأمل أن يساعد :)

تجنب القياسية Asp.Net مراقبة استخدام NeadUpload مكون من Brettle التنمية: http://www.brettle.com/neatupload

أسرع وأسهل للاستخدام ، أي الحاجة إلى القلق حول maxRequestLength المعلمة في ملفات التكوين و من السهل جدا على الاندماج.

كخيار بديل, يمكنك استخدام "قبول" سمة HTML ملف الإدخال الذي يحدد أنواع MIME مقبولة.

تعريف هنا

الخيار الوحيد الخاص بك يبدو أن التحقق من جانب العميل ، لأن الخادم الجانب يعني الملف التي تم تحميلها بالفعل.أيضا نوع MIME عادة ما تمليه امتداد الملف.

استخدام الإطار جافا سكريبت مسج مثل تفرط في onsubmit الحدث من النموذج.ثم تحقق التمديد.هذا سوف يحد من معظم المحاولات.ومع ذلك إذا كان الشخص يغير صورة امتداد XLS ثم سيكون لديك مشكلة.

أنا لا أعرف إذا كان هذا هو الخيار لك ولكن لديك المزيد من العميل التحكم عند استخدام شيء مثل سيلفرلايت أو فلاش لتحميل.قد ترغب في استخدام واحدة من هذه التكنولوجيات عملية التحميل الخاص بك.

آخر المدعى عليه ملاحظات, نوع الملف يمكن المغشوش (على سبيل المثال،.exe إعادة تسميته .pdf) ، والتي التحقق من نوع MIME لا يمنع (أي .exe سوف تظهر MIME "application/pdf" إذا تسميته .pdf).أعتقد أن الاختيار الحقيقي نوع ملف يمكن أن يتم إلا الخادم ، طريقة سهلة للتحقق من استخدام النظام.IO.BinaryReader هو موضح هنا:

http://forums.asp.net/post/2680667.aspx

و VB النسخة هنا:

http://forums.asp.net/post/2681036.aspx

ملاحظة أنك سوف تحتاج إلى معرفة الثنائية 'رموز' لنوع الملف(ق) كنت التحقق ، ولكن يمكنك الحصول عليها من خلال تنفيذ هذا الحل وتصحيح الأخطاء البرمجية.

التحقق من جانب العميل التحقق من:-

HTML:

<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="btnUpload" runat="server" Text="Upload" OnClientClick = "return ValidateFile()"  OnClick="btnUpload_Click"  />
<br />
<asp:Label ID="Label1" runat="server" Text="" />

جافا سكريبت:

<script type ="text/javascript">

    var validFilesTypes=["bmp","gif","png","jpg","jpeg","doc","xls"];

    function ValidateFile()

    {

      var file = document.getElementById("<%=FileUpload1.ClientID%>");

      var label = document.getElementById("<%=Label1.ClientID%>");

      var path = file.value;

      var ext=path.substring(path.lastIndexOf(".")+1,path.length).toLowerCase();

      var isValidFile = false;

      for (var i=0; i<validFilesTypes.length; i++)    
      {    
        if (ext==validFilesTypes[i])    
        {    
            isValidFile=true;    
            break;    
        }    
      }

      if (!isValidFile)    
      {    
        label.style.color="red";    
        label.innerHTML="Invalid File. Please upload a File with" +    
         " extension:\n\n"+validFilesTypes.join(", ");    
      }    
      return isValidFile;    
     }    
</script>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top