整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

asp.net文件断点上传

asp.net文件断点上传

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。

要求能够在网页上面上传文件夹,文件夹里面大约有1万多个文件,有大有小,大的有1G~10G,小的有几MB,

要求支持断点续传,支持进度信息离线存储,用户可能传一半没有传完,下班了,明天上班后继续上传,电脑晚上到点需要关机,支持加密传输,支持国密加密算法SM4,

对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传

从上传的效率来看,利用多线程并发上传能够达到最大效率。

断点续传,就是在文件上传的过程中发生了中断,人为因素(暂停)或者不可抗力(断网或者网络差)导致了文件上传到一半失败了。然后在环境恢复的时候,重新上传该文件,而不至于是从新开始上传的。

断点续传的功能是基于分块上传来实现的,把一个大文件分成很多个小块,服务端能够把每个上传成功的分块都落地下来,客户端在上传文件开始时调用接口快速验证,条件选择跳过某个分块。

实现原理,就是在每个文件上传前,就获取到文件MD5取值,在上传文件前调用接口,如果获取的文件状态是未完成,则返回所有的还没上传的分块的编号,然后前端进行条件筛算出哪些没上传的分块,然后进行上传。

当接收到文件块后就可以直接写入到服务器的文件中。


最新版本: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无需任何配置可直接访问页面进行测试

SQL

使用IIS

大文件上传测试推荐使用IIS以获取更高性能。

使用IIS Express

小文件上传测试可以使用IIS Express

创建数据库

配置数据库连接信息


检查数据库配置



访问页面进行测试


相关参考:

文件保存位置,


源码工程文档: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

产品源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授权生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1

avaScript开发——文件夹的上传和下载,JavaScript实现文件夹的上传和下载,JavaScript实现文件夹的上传和下载解决方案,JavaScript实现文件夹的上传和下载思路,JavaScript实现文件夹的上传和下载源码,JavaScript实现文件夹的上传和下载实例,JavaScript实现大文件分块上传和下载,JavaScript实现大文件分片上传和下载,JavaScript实现大文件加密上传和下载,JavaScript实现大文件批量上传和下载,


前端用了JS,JQuery,vue2,vue3,vue-cli,html5,html

网上搜了一下,基本上大部分的文章里面提到的前端JS或VUE或HTML5上传文件夹的方案都是使用JS的API来实现的,也就是html5提供的一个API,也就是chrome提供的API。用是能用,但是不够好用,有很多限制,也不够灵活。不太能够满足用户的实际应用需求,

多多少少还是有点问题,稳定性,灵活性,可扩展性,安全性方面还是有点问题。chrome的每个域名只允许5个TCP连接的限制,这个基本上是一个无法逾越的鸿沟,目前为止网上还没有发现哪家公司或者个人能够突破的。

我们做项目的话个人用户比较少,一般都是行业用户,比如政府,公司,金融,这类企业,他们对用户体验要求较高。就实际项目开发和实施的情况来看,html5或者chrome提供的功能基本上都是不能够满足他们需求的,都需要我们进行定制开发。

文件夹上传,html5提供了API,用户开始用的时候还行,然后就提了要求要求支持断点续传,

断点续传,就是在文件上传的过程中发生了中断,人为因素(暂停)或者不可抗力(断网或者网络差)导致了文件上传到一半失败了。然后在环境恢复的时候,重新上传该文件,而不至于是从新开始上传的。

断点续传的功能是基于分块上传来实现的,把一个大文件分成很多个小块,服务端能够把每个上传成功的分块都落地下来,客户端在上传文件开始时调用接口快速验证,条件选择跳过某个分块。

实现原理,就是在每个文件上传前,就获取到文件MD5取值,在上传文件前调用接口,如果获取的文件状态是未完成,则返回所有的还没上传的分块的编号,然后前端进行条件筛算出哪些没上传的分块,然后进行上传。

当接收到文件块后就可以直接写入到服务器的文件中。


导入项目:
导入到Eclipse:
http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
导入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
springboot统一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2



下载示例:

https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/




工程



NOSQL

NOSQL示例不需要任何配置,可以直接访问测试



创建数据表

选择对应的数据表脚本,这里以SQL为例




修改数据库连接信息


访问页面进行测试



文件存储路径

up6/upload/年/月/日/guid/filename






相关问题:
1.javax.servlet.http.HttpServlet错误
2.项目无法发布到tomcat
3.md5计算完毕后卡住
4.服务器找不到config.json文件

相关参考:

文件保存位置


源码工程文档: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

产品源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授权生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1

解JavaScript中请求的暂停机制是软件开发过程中的一个重要知识点。在这篇文章中,我们将会通过深入的讨论和探索来解答这个问题:“JS发起的请求可以暂停吗?

首先,我们需要明确这个问题包含的两个关键概念:一是“暂停”的定义是什么?二是所谓的"JS发起的请求"指的是什么?

什么是“暂停”?

"暂停",或者说是“暂时停止”,指的是在一个已经开始但未结束的过程中的临时停止。这意味着这个过程可以在某个时间点中断,然后在另一个时间点重新恢复。

JS发起的请求是什么?

要回答这个问题,我们需要先简单了解一下TCP/IP网络模型。网络模型从上到下分为应用层、传输层、网络层和网络接口层。在每次网络传输中,应用数据在发送到目标之前,都需要通过网络模型的每一层进行包装。这就像寄快递一样,我们需要先打包物品、确认包裹的大小,然后将包裹装进盒子、登记目的地,最后将包裹装上车,送往目的地。

网络传输示意图

在这里,“请求(Request)”可以被理解为客户端通过多次数据网络传输,将单份数据完整地发送给服务端的行为。而服务端对某次请求发送的回应数据,可以被称之为“响应(Response)”。

理论上来说,应用层的协议可以通过各种手段,比如标记数据包的序列号,来实现暂停的机制。但是,TCP协议并不支持暂停。TCP协议的数据传输是流式的,数据被视为一连串的字节流。客户端发送的数据会被拆分成多个TCP段,这些段在网络中是独立传输的,因此无法直接控制每个TCP段的传输,也就无法实现暂停请求或者暂停响应的功能。


解答提问

如果所说的“请求”是指网络模型中的一次请求传输,那么很明显,这样的请求是无法被暂停的。

但是,如果我们从JS发起的请求的角度来看这个问题,那问题中的“请求”,更可能是指JS运行时中发起的XMLHttpRequest或fetch请求。既然请求已经发起,那么问题自然就变成了“响应是否可以被暂停”。

我们都知道,像大文件的分片上传、分片下载等功能,本质上是将分片顺序定好之后按顺序请求,然后通过中断顺序并记录中断点来实现暂停和重传的机制。然而,对于单个请求来说,并没有这样的环境。

用JS实现“假暂停”机制

虽然我们无法真正实现请求的暂停,但我们可以模拟一个“假暂停”的功能。在前端的业务场景中,数据并不是一接收到就可以直接展示给用户的。前端开发者需要对这些数据进行处理后,才能渲染到界面上。如果我们能在请求发起之前增加一个控制器,在请求返回时,如果控制器处于暂停状态,则不处理数据,等到控制器恢复后再进行处理。这样也能达到我们的目的。接下来,我们会尝试一下如何实现这样一个假暂停的功能。

我们可以设计一个控制器Promise,和请求一起被Promise.all包裹起来。当fetch完成时,判断这个控制器的暂停状态,如果没有被暂停,那么控制器就可以直接resolve,整个Promise.all也随之resolve。

下面是一段具体的代码实现:

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 }
}

我们可以通过调用requestWithPauseControl(_request)来替代调用_request,通过返回的pause和resume方法控制暂停和继续。

用法

在我们的示例中,我们将模拟一个情景,假设你正在请求一个巨大的JSON文件,这可能需要一些时间。然后,我们将实现一个按钮,用户可以点击它来暂停和恢复请求。

// 创造我们的"大"请求
function bigRequest() {
    return new Promise(resolve=> {
        setTimeout(()=> {
            resolve({ data: "This is a big JSON file." });
        }, 5000);
    });
}


// 使用我们的暂停控制函数
const controlledRequest=requestWithPauseControl(bigRequest);


// 创建暂停/恢复按钮
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);


// 发起请求
controlledRequest.then(data=> {
    console.log("Data received: ", data);
}).catch(error=> {
    console.error("Error: ", error);
});

这个案例可以在一个网页上运行,当用户点击按钮时,请求将在暂停和恢复之间切换,最后接收到的数据将打印在控制台中。虽然实际的请求没有真正暂停(因为我们不能直接暂停一个已经发送的HTTP请求),但我们可以控制当数据返回时我们做什么,从而模拟出暂停和恢复的效果。

请注意,我们这里的bigRequest函数仅用于模拟一个需要较长时间才能完成的请求。在实际应用中,这将是一个实际的网络请求,例如使用fetch或axios等。

总结

在这篇文章中,我们讨论了JS发起的请求能否被暂停的问题,探讨了暂停的定义和请求的含义,并且介绍了如何在JS中实现假暂停的机制。虽然在网络层面,我们无法直接控制请求的暂停,但是在应用层面,我们可以通过一些巧妙的设计,实现请求的暂停功能,从而在一定程度上满足我们的业务需求。

感谢您阅读本文,如果对您有帮助,请点赞、关注和收藏。您的支持就是我继续的动力,让我们一起在前端的道路上不断前行,共同成长!