sp.net文件斷點上傳,asp.net文件斷點上傳解決方案,asp.net文件斷點上傳思路,asp.net文件斷點上傳實例,asp.net文件斷點上傳源碼,asp.net文件分塊上傳,asp.net文件切片上傳,asp.net文件分片上傳,asp.net文件加密上傳,asp.net文件夾上傳,
.net上傳超大文件解決方案,.net上傳超大文件,.net上傳文件夾解決方案,.net批量上傳超大文件解決方案,.net分塊上傳超大文件解決方案,.net分片上傳超大文件解決方案,.net切片上傳超大文件解決方案,.net加密上傳超大文件解決方案,.net上傳超大文件解決方案,.net上傳大文件,
前端用了HTML,VUE2,VUE3,
后端用了ASP.NET,.NET Core.NET MVC,IDE用了Visual Studio 2010,Visual Studio 2013,Visual Studio 2022,因為新項目和老項目都用了兩種IDE。
要求能夠在網(wǎng)頁上面上傳文件夾,文件夾里面大約有1萬多個文件,有大有小,大的有1G~10G,小的有幾MB,
要求支持?jǐn)帱c續(xù)傳,支持進(jìn)度信息離線存儲,用戶可能傳一半沒有傳完,下班了,明天上班后繼續(xù)上傳,電腦晚上到點需要關(guān)機,支持加密傳輸,支持國密加密算法SM4,
對于大文件的處理,無論是用戶端還是服務(wù)端,如果一次性進(jìn)行讀取發(fā)送、接收都是不可取,很容易導(dǎo)致內(nèi)存問題。所以對于大文件上傳,采用切塊分段上傳
從上傳的效率來看,利用多線程并發(fā)上傳能夠達(dá)到最大效率。
斷點續(xù)傳,就是在文件上傳的過程中發(fā)生了中斷,人為因素(暫停)或者不可抗力(斷網(wǎng)或者網(wǎng)絡(luò)差)導(dǎo)致了文件上傳到一半失敗了。然后在環(huán)境恢復(fù)的時候,重新上傳該文件,而不至于是從新開始上傳的。
斷點續(xù)傳的功能是基于分塊上傳來實現(xiàn)的,把一個大文件分成很多個小塊,服務(wù)端能夠把每個上傳成功的分塊都落地下來,客戶端在上傳文件開始時調(diào)用接口快速驗證,條件選擇跳過某個分塊。
實現(xiàn)原理,就是在每個文件上傳前,就獲取到文件MD5取值,在上傳文件前調(diào)用接口,如果獲取的文件狀態(tài)是未完成,則返回所有的還沒上傳的分塊的編號,然后前端進(jìn)行條件篩算出哪些沒上傳的分塊,然后進(jìn)行上傳。
當(dāng)接收到文件塊后就可以直接寫入到服務(wù)器的文件中。
最新版本:6.5.40
在線代碼:https://gitee.com/xproer/up6-asp-net/tree/6.5.40/
安裝.NET Framework 4.7.2
https://dotnet.microsoft.com/en-us/download/dotnet-framework/net472
框架選擇4.7.2
添加3rd引用
編譯項目
NOSQL
NOSQL無需任何配置可直接訪問頁面進(jìn)行測試
SQL
使用IIS
大文件上傳測試推薦使用IIS以獲取更高性能。
使用IIS Express
小文件上傳測試可以使用IIS Express
創(chuàng)建數(shù)據(jù)庫
配置數(shù)據(jù)庫連接信息
檢查數(shù)據(jù)庫配置
訪問頁面進(jìn)行測試
相關(guān)參考:
文件保存位置,
源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra
源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl
OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a
產(chǎn)品源代碼:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授權(quán)生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1
avaScript開發(fā)——文件夾的上傳和下載,JavaScript實現(xiàn)文件夾的上傳和下載,JavaScript實現(xiàn)文件夾的上傳和下載解決方案,JavaScript實現(xiàn)文件夾的上傳和下載思路,JavaScript實現(xiàn)文件夾的上傳和下載源碼,JavaScript實現(xiàn)文件夾的上傳和下載實例,JavaScript實現(xiàn)大文件分塊上傳和下載,JavaScript實現(xiàn)大文件分片上傳和下載,JavaScript實現(xiàn)大文件加密上傳和下載,JavaScript實現(xiàn)大文件批量上傳和下載,
前端用了JS,JQuery,vue2,vue3,vue-cli,html5,html
網(wǎng)上搜了一下,基本上大部分的文章里面提到的前端JS或VUE或HTML5上傳文件夾的方案都是使用JS的API來實現(xiàn)的,也就是html5提供的一個API,也就是chrome提供的API。用是能用,但是不夠好用,有很多限制,也不夠靈活。不太能夠滿足用戶的實際應(yīng)用需求,
多多少少還是有點問題,穩(wěn)定性,靈活性,可擴(kuò)展性,安全性方面還是有點問題。chrome的每個域名只允許5個TCP連接的限制,這個基本上是一個無法逾越的鴻溝,目前為止網(wǎng)上還沒有發(fā)現(xiàn)哪家公司或者個人能夠突破的。
我們做項目的話個人用戶比較少,一般都是行業(yè)用戶,比如政府,公司,金融,這類企業(yè),他們對用戶體驗要求較高。就實際項目開發(fā)和實施的情況來看,html5或者chrome提供的功能基本上都是不能夠滿足他們需求的,都需要我們進(jìn)行定制開發(fā)。
文件夾上傳,html5提供了API,用戶開始用的時候還行,然后就提了要求要求支持?jǐn)帱c續(xù)傳,
斷點續(xù)傳,就是在文件上傳的過程中發(fā)生了中斷,人為因素(暫停)或者不可抗力(斷網(wǎng)或者網(wǎng)絡(luò)差)導(dǎo)致了文件上傳到一半失敗了。然后在環(huán)境恢復(fù)的時候,重新上傳該文件,而不至于是從新開始上傳的。
斷點續(xù)傳的功能是基于分塊上傳來實現(xiàn)的,把一個大文件分成很多個小塊,服務(wù)端能夠把每個上傳成功的分塊都落地下來,客戶端在上傳文件開始時調(diào)用接口快速驗證,條件選擇跳過某個分塊。
實現(xiàn)原理,就是在每個文件上傳前,就獲取到文件MD5取值,在上傳文件前調(diào)用接口,如果獲取的文件狀態(tài)是未完成,則返回所有的還沒上傳的分塊的編號,然后前端進(jìn)行條件篩算出哪些沒上傳的分塊,然后進(jìn)行上傳。
當(dāng)接收到文件塊后就可以直接寫入到服務(wù)器的文件中。
導(dǎo)入項目:
導(dǎo)入到Eclipse:http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
導(dǎo)入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
springboot統(tǒng)一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2
下載示例:
https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/
工程
NOSQL
NOSQL示例不需要任何配置,可以直接訪問測試
創(chuàng)建數(shù)據(jù)表
選擇對應(yīng)的數(shù)據(jù)表腳本,這里以SQL為例
修改數(shù)據(jù)庫連接信息
訪問頁面進(jìn)行測試
文件存儲路徑
up6/upload/年/月/日/guid/filename
相關(guān)問題:
1.javax.servlet.http.HttpServlet錯誤
2.項目無法發(fā)布到tomcat
3.md5計算完畢后卡住
4.服務(wù)器找不到config.json文件
相關(guān)參考:
文件保存位置
源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra
源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl
OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a
產(chǎn)品源代碼:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授權(quán)生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1
解JavaScript中請求的暫停機制是軟件開發(fā)過程中的一個重要知識點。在這篇文章中,我們將會通過深入的討論和探索來解答這個問題:“JS發(fā)起的請求可以暫停嗎?”
首先,我們需要明確這個問題包含的兩個關(guān)鍵概念:一是“暫停”的定義是什么?二是所謂的"JS發(fā)起的請求"指的是什么?
"暫停",或者說是“暫時停止”,指的是在一個已經(jīng)開始但未結(jié)束的過程中的臨時停止。這意味著這個過程可以在某個時間點中斷,然后在另一個時間點重新恢復(fù)。
JS發(fā)起的請求是什么?
要回答這個問題,我們需要先簡單了解一下TCP/IP網(wǎng)絡(luò)模型。網(wǎng)絡(luò)模型從上到下分為應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。在每次網(wǎng)絡(luò)傳輸中,應(yīng)用數(shù)據(jù)在發(fā)送到目標(biāo)之前,都需要通過網(wǎng)絡(luò)模型的每一層進(jìn)行包裝。這就像寄快遞一樣,我們需要先打包物品、確認(rèn)包裹的大小,然后將包裹裝進(jìn)盒子、登記目的地,最后將包裹裝上車,送往目的地。
網(wǎng)絡(luò)傳輸示意圖
在這里,“請求(Request)”可以被理解為客戶端通過多次數(shù)據(jù)網(wǎng)絡(luò)傳輸,將單份數(shù)據(jù)完整地發(fā)送給服務(wù)端的行為。而服務(wù)端對某次請求發(fā)送的回應(yīng)數(shù)據(jù),可以被稱之為“響應(yīng)(Response)”。
理論上來說,應(yīng)用層的協(xié)議可以通過各種手段,比如標(biāo)記數(shù)據(jù)包的序列號,來實現(xiàn)暫停的機制。但是,TCP協(xié)議并不支持暫停。TCP協(xié)議的數(shù)據(jù)傳輸是流式的,數(shù)據(jù)被視為一連串的字節(jié)流。客戶端發(fā)送的數(shù)據(jù)會被拆分成多個TCP段,這些段在網(wǎng)絡(luò)中是獨立傳輸?shù)模虼藷o法直接控制每個TCP段的傳輸,也就無法實現(xiàn)暫停請求或者暫停響應(yīng)的功能。
如果所說的“請求”是指網(wǎng)絡(luò)模型中的一次請求傳輸,那么很明顯,這樣的請求是無法被暫停的。
但是,如果我們從JS發(fā)起的請求的角度來看這個問題,那問題中的“請求”,更可能是指JS運行時中發(fā)起的XMLHttpRequest或fetch請求。既然請求已經(jīng)發(fā)起,那么問題自然就變成了“響應(yīng)是否可以被暫停”。
我們都知道,像大文件的分片上傳、分片下載等功能,本質(zhì)上是將分片順序定好之后按順序請求,然后通過中斷順序并記錄中斷點來實現(xiàn)暫停和重傳的機制。然而,對于單個請求來說,并沒有這樣的環(huán)境。
雖然我們無法真正實現(xiàn)請求的暫停,但我們可以模擬一個“假暫停”的功能。在前端的業(yè)務(wù)場景中,數(shù)據(jù)并不是一接收到就可以直接展示給用戶的。前端開發(fā)者需要對這些數(shù)據(jù)進(jìn)行處理后,才能渲染到界面上。如果我們能在請求發(fā)起之前增加一個控制器,在請求返回時,如果控制器處于暫停狀態(tài),則不處理數(shù)據(jù),等到控制器恢復(fù)后再進(jìn)行處理。這樣也能達(dá)到我們的目的。接下來,我們會嘗試一下如何實現(xiàn)這樣一個假暫停的功能。
我們可以設(shè)計一個控制器Promise,和請求一起被Promise.all包裹起來。當(dāng)fetch完成時,判斷這個控制器的暫停狀態(tài),如果沒有被暫停,那么控制器就可以直接resolve,整個Promise.all也隨之resolve。
下面是一段具體的代碼實現(xiàn):
function _request () {
return new Promise<number>((res)=> setTimeout(()=> {
res(123)
}, 3000))
}
function createPauseControllerPromise () {
const result={
isPause: false,
resolveWhenResume: false,
resolve (value?: any) {},
pause () {
this.isPause=true
},
resume () {
if (!this.isPause) return
this.isPause=false
if (this.resolveWhenResume) {
this.resolve()
}
},
promise: Promise.resolve()
}
const promise=new Promise<void>((res)=> {
result.resolve=res
})
result.promise=promise
return result
}
function requestWithPauseControl <T extends ()=> Promise<any>>(request: T) {
const controller=createPauseControllerPromise()
const controlRequest=request().then((data)=> {
if (!controller.isPause) controller.resolve()
return data
}).finally(()=> {
controller.resolveWhenResume=true
})
const result=Promise.all([controlRequest, controller.promise]).then(data=> {
controller.resolve()
return data[0]
});
(result as any).pause=controller.pause.bind(controller);
(result as any).resume=controller.resume.bind(controller);
return result as ReturnType<T> & { pause: ()=> void, resume: ()=> void }
}
我們可以通過調(diào)用requestWithPauseControl(_request)來替代調(diào)用_request,通過返回的pause和resume方法控制暫停和繼續(xù)。
在我們的示例中,我們將模擬一個情景,假設(shè)你正在請求一個巨大的JSON文件,這可能需要一些時間。然后,我們將實現(xiàn)一個按鈕,用戶可以點擊它來暫停和恢復(fù)請求。
// 創(chuàng)造我們的"大"請求
function bigRequest() {
return new Promise(resolve=> {
setTimeout(()=> {
resolve({ data: "This is a big JSON file." });
}, 5000);
});
}
// 使用我們的暫停控制函數(shù)
const controlledRequest=requestWithPauseControl(bigRequest);
// 創(chuàng)建暫停/恢復(fù)按鈕
const pauseButton=document.createElement("button");
pauseButton.innerHTML="Pause/Resume";
pauseButton.addEventListener("click", ()=> {
if (controlledRequest.isPaused) {
controlledRequest.resume();
console.log("Request resumed");
} else {
controlledRequest.pause();
console.log("Request paused");
}
});
// 將按鈕添加到頁面
document.body.appendChild(pauseButton);
// 發(fā)起請求
controlledRequest.then(data=> {
console.log("Data received: ", data);
}).catch(error=> {
console.error("Error: ", error);
});
這個案例可以在一個網(wǎng)頁上運行,當(dāng)用戶點擊按鈕時,請求將在暫停和恢復(fù)之間切換,最后接收到的數(shù)據(jù)將打印在控制臺中。雖然實際的請求沒有真正暫停(因為我們不能直接暫停一個已經(jīng)發(fā)送的HTTP請求),但我們可以控制當(dāng)數(shù)據(jù)返回時我們做什么,從而模擬出暫停和恢復(fù)的效果。
請注意,我們這里的bigRequest函數(shù)僅用于模擬一個需要較長時間才能完成的請求。在實際應(yīng)用中,這將是一個實際的網(wǎng)絡(luò)請求,例如使用fetch或axios等。
總結(jié)
在這篇文章中,我們討論了JS發(fā)起的請求能否被暫停的問題,探討了暫停的定義和請求的含義,并且介紹了如何在JS中實現(xiàn)假暫停的機制。雖然在網(wǎng)絡(luò)層面,我們無法直接控制請求的暫停,但是在應(yīng)用層面,我們可以通過一些巧妙的設(shè)計,實現(xiàn)請求的暫停功能,從而在一定程度上滿足我們的業(yè)務(wù)需求。
感謝您閱讀本文,如果對您有幫助,請點贊、關(guān)注和收藏。您的支持就是我繼續(xù)的動力,讓我們一起在前端的道路上不斷前行,共同成長!
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。