2013-07-25 2 views
2

Как проверить размер файла для каждого файла перед загрузкой нескольких файлов в ajaxtoolkit ajaxfileupload в asp.net?

<cc1:AjaxFileUpload ID="AjaxFileUpload1" AllowedFileTypes="jpg,jpeg" 
runat="server" MaximumNumberOfFiles="4" OnUploadComplete="AjaxFileUpload1_UploadComplete" 
     /> 

код позади файл

protected void AjaxFileUpload1_UploadComplete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e) 
    { 
     if (e.FileSize > 10) 
     { 
      string filePath = e.FileName; 
      AjaxFileUpload1.SaveAs(Server.MapPath(filePath)); 
     } 
     else 
     { 

     } 
    } 

Я хочу, чтобы проверить, что все размеры файлов не должны превышать определенное значение, прежде чем загружать файлы события.

+0

Ваш текущий код проверяет размер файла после того, как она была загружена. Если вам нужно что-то проверить перед загрузкой, я бы предложил сторонний инструмент, такой как PlUpload. –

+0

Я хочу использовать элемент управления AjaxToolkit, есть ли способ проверить размер файла на стороне клиента. – bhanu

+0

Не с контролем AjaxFileUpload. 'AsyncFileUpload' имеет' OnClientUploadStarted', который может вызывать функцию JS, которую вы можете использовать для проверки размера файла. –

ответ

3

Попробуйте так: сторона

Сервера:

protected void AjaxFileUpload1_UploadComplete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e) 
{ 
    try 
    { 
     string savePath = MapPath("~/Images/" + e.FileName); 
     // dont save file & return if condition not matched. 
     if (e.FileSize > 72000) // use same condition in client side code 
     { 
      return; 
     } 
     AjaxFileUpload1.SaveAs(savePath); 
    } 
    catch (Exception ex)  
    { 
     throw ex; 
    } 
} 

и на стороне клиента:

<script type="text/javascript"> 
    function UploadComplete(sender, args) { 
     var filesize = args.get_fileSize(); 
     var fileId = args.get_fileId(); 

     var status = document.getElementById('AjaxFileUpload1_FileItemStatus_' + fileId); 
     var container = document.getElementById('AjaxFileUpload1_FileInfoContainer_' + fileId); 


     if (filesize > 72000) { // same condition used for server side 
      document.getElementById('lblStatus').innerText = "error"; 
      if (status.innerText) { 
       status.innerText = " (Error)"; 
      } 
      if (status.textContent) { 
       status.textContent = " (Error)"; 
      } 
      container.style.color = 'Red'; 
     } 
    } 
</script> 

<cc1:AjaxFileUpload ID="AjaxFileUpload1" AllowedFileTypes="jpg,jpeg" runat="server" MaximumNumberOfFiles="4" OnUploadComplete="AjaxFileUpload1_UploadComplete" OnClientUploadComplete="UploadComplete" /> 

Надеется, что это помогает! !

0

Смотрите код ниже:

public void afuUpload_UploadedComplete(object sender, AsyncFileUploadEventArgs e) 
    { 
    try 
    { 
     string savePath = MapPath("~/Uploads/" + Path.GetFileName(e.filename)); 
     if (int.Parse(e.filesize) > 3000000) 
     { 
      return; 
     } 
     afuUpload.SaveAs(savePath); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    }} 
+0

Код выше не сохраняет файл, если длина файла больше 3000000, но он выводится так, как если бы файлы загружались, в этом случае не возникает ошибка, можете ли вы рассказать мне, как отображать ошибку на выходной странице, поскольку в настоящее время она показывая, что файлы загружены. – bhanu

+0

@bhanu извините, не сделал вас, не могли бы вы сделать картинку более понятной –

0

Идея состоит в том, чтобы предотвратить загрузку файла на сервер. В предлагаемом решении, когда код потока достиг afuUpload_UploadedComplete, файл был загружен на сервер, но еще не записан в указанном вами пути. Например, если предел составляет 20 мегабайт, а выбранный файл - 22 мегабайта, когда код достигает afuUpload_UploadedComplete, 22 мегабайта уже загружены на сервер.

Решение состоит в том, что проверка выполняется на стороне клиента (JavaScript), что предотвращает получение кода на сервере CodeBehind.

В моем случае я попытался установить OnClientUploadComplete, генерируя исключение, когда предел размера файла превышен, но он не работает, и код по-прежнему достигает CodeBehind. Другая проблема заключается в том, что когда возникает исключение, функция JavaScript OnClientUploadError не стреляет, чтобы перехватить исключение, сгенерированное в функции OnClientUploadComplete.

1
<script type="text/javascript"> 
    $(".ajax__fileupload_dropzone").bind("drop", function() { 
      checkfilesize(); 
    }); 
    $(".ajax__fileupload_queueContainer").bind("click", function() {  
      checkfilesize(); 
    }); 
    $(".ajax__fileupload_uploadbutton").bind("mouseenter", function() { 
      checkfilesize(); 
    }); 

    function checkfilesize() { 
     var total_filesize_num = 0; 
     var myElements = $(".filesize"); 
     if (myElements.length == 0) { 
      $(".ajax__fileupload_uploadbutton").css("visibility", "hidden"); 
      return; 
     } 
     for (var i = 0; i < myElements.length; i++) {    
      var filesize = myElements.eq(i).html(); //$(".filesize").html();  
      total_filesize_num = total_filesize_num + filesize_tonum(filesize); 
     } 
     if (total_filesize_num > 5) { 
      $(".ajax__fileupload_uploadbutton").css("visibility", "hidden"); 
      alert('Maximum file size is 5MB only! Please select another one.'); 
      return; 
     } else { 
      $(".ajax__fileupload_uploadbutton").css("visibility", "visible"); 
     } 
    } 
    function countsumfilesize() { 
     var sumfilesize = 0; 
     var myElements = $(".filesize"); 
     for (var i = 0; i < myElements.length; i++) { 
      alert(myElements.eq(i).html()); 
     } 
    } 
    function filesize_tonum(filesize) { 
     var filesize_num = 0; 
     if (filesize.indexOf("kb") > 0) { 
      var space = filesize.lastIndexOf(" "); 
      filesize_num = parseFloat("0." + filesize.substr(0, filesize.length - space + 1)); 
     } 
     else if (filesize.indexOf("MB") > 0) { 
      var space = filesize.lastIndexOf(" "); 
      filesize_num = parseFloat(filesize.substr(0, filesize.length - space + 1)); 
     }  
     return filesize_num; 
    } 

    </script> 

<ajaxToolkit:AjaxFileUpload ID="AjaxFileUploadImage" runat="server" OnClientUploadComplete="uploadComplete" MaximumNumberOfFiles="1" AllowedFileTypes="gif,png,jpg,jpeg" onchange="checkfilesize(); return false;" /> 
0

Контроллер

[HttpPost] 
public ActionResult Create(string Album, Photo photo, IEnumerable<HttpPostedFileBase> files, DateTime? datec, string NewAlbum = null) 
    { 
    ..... 

    foreach (var file in files) 
      { 
       decimal sum = file.ContentLength/1048; 
       if (sum > 4000) 
       { 
        errorlist2 += "Sorry " + file.FileName + " has exceeded its file limit off 4 MB <br/>"; 


       } 

      } 

    if (errorlist2 != "") 
       { 
        ViewBag.Error = errorlist2; 
        return View(photo); 
       } 

    // we dont want put the message in the loop it will come out on first max limit , rather find all files in excess, then we can pass the message 
    //also make sure your web config is set for a limit on max size 

//using the normal html multi uploaded 

// <input type="file" name="files" id="files" required multiple="multiple" accept=".jpg, .png, .gif" size="4" /> 
Смежные вопросы