文件上傳或多文件上傳,不能訪問已關閉的文件

異常:System.ObjectDisposedException: Cannot access a closed file.web

錯誤指向:讀取流的內容語句 stream.Read(byteArr, 0, byteArr.Length);瀏覽器

固然,這裏沒有使用流來操做上傳文件的,使用HttpContext.Request.Files[i].SaveAs(),也會出現這個問題。解決方案同下。緩存

/// <summary>
        /// 文件上傳
        /// </summary>
        /// <param name="inputStream">上傳的文件流</param>
        /// <param name="filePath">上傳文件的保存路徑</param> 
        /// <param name="msg">錯誤信息</param>
        /// <returns></returns>
        public static bool SaveFile(Stream inputStream, string filePath, out string msg)
        {
            try
            {
                LogUtil.Info("文件上傳操做類FileUpLoad,上傳文件到服務器:SaveFile(),文件保存路徑" + filePath);
                if (Directory.Exists(filePath))
                {
                    msg = "文件已存在";
                    return false;
                }
                byte[] byteArr = new byte[inputStream.Length];
                Stream stream = inputStream;
                stream.Read(byteArr, 0, byteArr.Length);
                using (FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write))
                {
                    fs.Write(byteArr, 0, byteArr.Length);
                }
                msg = string.Empty;
                return true;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                //return false;
                LogUtil.Error("文件上傳操做類FileUpLoad,上傳文件到服務器:SaveFile()異常",ex);
                throw ex;
            }
        }
View Code

搜索網上解決方案;服務器

在web.config中添加app

<httpRuntime executionTimeout="90" maxRequestLength="2097151" useFullyQualifiedRedirectUrl="false" requestLengthDiskThreshold="8192"/>ide

固然也有部分兄臺說不能解決此問題的。這裏咱們不討論,問題因人而異。咱們就事論事。ui

根據此解決方案,咱們來查詢這些設置的做用。spa

官方文檔:線程

httpRuntime的全部設置字段列出:調試

 

屬性

 

 

 

屬性 說明

apartmentThreading

可選的 Boolean 屬性。

啓用單元線程處理以實現傳統的 ASP 兼容性。

此屬性是 .NET Framework 2.0 版中的新屬性。默認值爲 False

appRequestQueueLimit

可選的 Int32 屬性。

指定 ASP.NET 將爲應用程序排隊的請求的最大數目。當沒有足夠的自由線程來處理請求時,將對請求進行排隊。當隊列超出了該屬性中指定的限制時,將經過「503 - 服務器太忙」錯誤信息拒絕傳入的請求。

默認值爲 5000。

Note注意

在 .NET Framework 1.0 版和 1.1 版中,默認值爲 100。

delayNotificationTimeout

可選的 TimeSpan 屬性。

指定延遲通知的超時時間。

此屬性是 .NET Framework 2.0 版中的新屬性。

默認值爲「00:00:05」(5 秒)。

enable

可選的 Boolean 屬性。

指定是否在當前的節點及子節點級別啓用應用程序域 (AppDomain),以接受傳入的請求。若是爲 False,則實際上關閉了該應用程序。

默認值爲 True

enableHeaderChecking

可選的 Boolean 屬性。

指定 ASP.NET 是否應檢查請求標頭,以檢測可能的注入式攻擊。若是檢測到攻擊,ASP.NET 將返回錯誤做爲響應。

此屬性是 .NET Framework 2.0 版中的新屬性。

默認值爲 True

enableKernelOutputCache

可選的 Boolean 屬性。

指定是否啓用輸出緩存。該屬性只有在安裝 Microsoft Internet 信息服務 (IIS) 6.0 或更高版本以後才起相應的做用。輸出緩存的配置和請求的類型決定了是否對內容進行緩存。

若要對響應進行緩存,必須知足如下條件:

  • 必須經過頁指令或使用緩存 API 顯式啓用緩存。

  • 緩存必須具備過時策略,以便內核知道什麼時候放棄響應。

  • 緩存不能有任何可變標頭或參數。

  • 不須要身份驗證。

默認值爲 True

enableVersionHeader

可選的 Boolean 屬性。

指定 ASP.NET 是否應輸出版本標頭。Microsoft Visual Studio 2005 使用該屬性來肯定當前使用的 ASP.NET 版本。對於生產環境,該屬性不是必需的,能夠禁用。

Note注意

該屬性在 .NET Framework 1.0 版中不可用。

默認值爲 True

executionTimeout

可選的 TimeSpan 屬性。

指定在被 ASP.NET 自動關閉前,容許執行請求的最大秒數。

只有當 compilation 元素中的調試屬性爲 False 時,此超時屬性才適用。若要幫助避免在調試期間關閉應用程序,請不要將此超時屬性設置爲較大值。

Note注意

在 .NET Framework 1.0 版和 1.1 版中,默認值爲 90。

默認值爲「00:01:50」(110 秒)。

maxRequestLength

可選的 Int32 屬性。

指定輸入流緩衝閾值限制(以 KB 爲單位)。此限制可用於防止拒絕服務攻擊;例如,因用戶向服務器發送大型文件而致使的拒絕服務攻擊。

默認值爲 4096 (4 MB)。

maxWaitChangeNotification

可選的 Int32 屬性。

指定從第一次文件更改通知開始,在爲新請求從新啓動 AppDomain 以前等待的最長時間(秒)。將此屬性設置爲一個大於完成任何文件複製過程所需時間的數值。根據該屬性和 waitChangeNotification 屬性的值來合併文件更改通知。

此屬性是 .NET Framework 2.0 版中的新屬性。

默認值爲 0

minFreeThreads

可選的 Int32 屬性。

指定容許執行新請求的自由線程的最小數目。ASP.NET 爲要求附加線程來完成其處理的請求而使指定數目的線程保持自由狀態。

默認值爲 8

minLocalRequestFreeThreads

可選的 Int32 屬性。

指定 ASP.NET 保持的容許執行新本地請求的自由線程的最小數目。這一指定的線程數目是爲從本地主機傳入的請求而保留的,以防某些請求在其處理期間發出對本地主機的子請求。這有助於避免可能的因遞歸從新進入 Web 服務器而致使的死鎖。

默認值爲 4

requestLengthDiskThreshold

可選的 Int32 屬性。

指定輸入流緩衝閾值限制(以字節爲單位)。該值不該超過 maxRequestLength 屬性。

此屬性是 .NET Framework 2.0 版中的新屬性。

默認值爲 256

   

requireRootedSaveAsPath

可選的 Boolean 屬性。

指定 SaveAs 方法中的 filename 參數是否必須爲絕對路徑。ASP.NET 進程必須具備在指定位置中建立文件的權限。

此屬性是 .NET Framework 2.0 版中的新屬性。

默認值爲 True

sendCacheControlHeader

可選的 Boolean 屬性。

指定是否發送默認狀況下設置爲 Private 的緩存控制標頭。若是爲 True,則客戶端緩存被禁用。

此屬性是 .NET Framework 2.0 版中的新屬性。

默認值爲 True

shutdownTimeout

可選的 TimeSpan 屬性。

指定容許輔助進程關閉的分鐘數。在達到該超時時間時,ASP.NET 關閉輔助進程。

此屬性是 .NET Framework 2.0 版中的新屬性。

默認值爲 "00:01:30"(90 秒)。

useFullyQualifiedRedirectUrl

可選的 Boolean 屬性。

指示客戶端重定向是不是徹底限定的(採用 "http://server/path" 格式,這是某些移動控件所必需的),或者指示是否代之以將相對重定向發送到客戶端。若是爲 True,則全部不是徹底限定的重定向都將自動轉換爲徹底限定的格式。

Note注意

若是爲 False,則某些瀏覽器在加載無 Cookie 會話中的頁時可能會遇到問題。

默認值爲 False

waitChangeNotification

可選的 Int32 屬性。

指定從新啓動 AppDomain 以前等待另外一次文件更改通知的時間(以秒爲單位)。將此屬性設置爲一個大於兩次文件複製更改通知更新之間的時間的數值。根據該屬性和 maxWaitChangeNotification 屬性的值來合併文件更改通知。

此屬性是 .NET Framework 2.0 版中的新屬性。

默認值爲 0 秒。

 

子元素

 

無。

 

父元素

 

 

 

元素 說明

configuration

公共語言運行庫和 .NET Framework 應用程序所使用的每一個配置文件中均須要的根元素。

system.web

指定配置文件中 ASP.NET 配置設置的根元素,而且包含各類配置元素,這些配置元素配置 ASP.NET Web 應用程序並控制這些應用程序的行爲方式。

 

 

根據上面的介紹,進過實驗,發現:

executionTimeout="90" maxRequestLength="2097151" 此兩個屬性設置文件大小和請求超時,若是不設置

requestLengthDiskThreshold="8192" ,則仍然上傳不成功,報上面的錯誤。

固然屬性值的大小,在範圍內,根據須要設置。

useFullyQualifiedRedirectUrl="false" 這個屬性設置貌似沒有影響。有沒有無所謂。

總結:本解決方案適合本人的狀況。不能解決問題的朋友自行研究。

這裏另外說一點,本人當時在設置這些屬性時,由於只設置了executionTimeout="90" maxRequestLength="2097151" 這兩個屬性,而後沒有成功,就放棄了

之後的設置,去研究其餘的解決方案,覺得這個解決方案是不行的,最後證實是徹底可行的,但是繞了一個大圈子,浪費了不少時間。因此說,在解決問題時,必定要

嚴謹,仔細,不要浮躁,想固然。

相關文章
相關標籤/搜索