位置: IT常识 - 正文

用JavaScript实现文件的上传与下载(javascript编写程序)

编辑:rootadmin
用JavaScript实现文件的上传与下载

推荐整理分享用JavaScript实现文件的上传与下载(javascript编写程序),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript编写程序,用javascript编写程序,并嵌入html网页,怎么用javascript,javascript怎么写,javascript怎么写,javascript编写,javascript怎么写,javascript编写,内容如对您有帮助,希望把文章链接给更多的朋友!

一、文件上传

1、普通文件上传

JavaScript 可以使用表单提交来实现文件上传。首先,在 HTML 中创建一个文件输入框:

<input type="file" id="fileInput">

 然后,在 JavaScript 中获取文件输入框的引用,并在其上设置事件监听器,如下所示:

var fileInput = document.getElementById('fileInput');fileInput.addEventListener('change', function () { // 在这里处理选择的文件});

在事件监听器中,可以使用 fileInput.files[0] 属性获取选择的文件,然后对文件进行处理。

接下来可以使用 XMLHttpRequest 或 fetch API 来上传文件。

使用 XMLHttpRequest:

var file = fileInput.files[0];var formData = new FormData();formData.append('file', file);var xhr = new XMLHttpRequest();xhr.open('POST', 'url', true);xhr.onload = function () { if (xhr.status === 200) { console.log('upload success'); }};xhr.send(formData);

 使用 fetch:

var file = fileInput.files[0];var formData = new FormData();formData.append('file', file);fetch('url', { method: 'POST', body: formData}).then(response => { if (response.ok) { console.log('upload success'); }});

另外还可以使用第三方库如 axios 来实现文件上传,具体实现方法可以参考相关文档。

2、大文件上传

2.1、前端实现代码

在上传大文件时,通常采用分块上传的方式。将大文件分成若干个块,每块一个 HTTP 请求上传。

实现大文件上传的步骤如下:

用户选择文件。将文件分成若干块。对于每一块,向服务器发送 HTTP 请求上传。服务器接收到文件块后,将其存储在服务器上。在所有块上传完成后,服务器将所有块合并成一个完整的文件。

JavaScript 可以使用 File API(File 和 Blob 对象)来实现文件的读取和上传。

用JavaScript实现文件的上传与下载(javascript编写程序)

下面是一个使用 JavaScript 实现大文件上传的简单实例,使用分块上传的方法。

<input type="file" id="file-input">// 上传文件块function uploadChunk(file, start, end, chunk) { var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload', true); xhr.setRequestHeader('Content-Type', 'application/octet-stream'); xhr.setRequestHeader('Content-Range', 'bytes ' + start + '-' + end + '/' + file.size); xhr.send(chunk);}// 上传文件function uploadFile(file) { var chunkSize = 1 * 1024 * 1024; // 分块大小为1MB var chunks = Math.ceil(file.size / chunkSize); // 计算分块数 var currentChunk = 0; // 当前分块 var start, end; while (currentChunk < chunks) { start = currentChunk * chunkSize; end = start + chunkSize >= file.size ? file.size : start + chunkSize; var chunk = file.slice(start, end); uploadChunk(file, start, end, chunk); currentChunk++; }}// 监听文件选择事件document.getElementById('file-input').addEventListener('change', function(e) { var file = e.target.files[0]; if (file) { uploadFile(file); }});

在这个实例中,我们使用了 XMLHttpRequest 对象上传文件,并设置了 Content-Type 和 Content-Range 消息头。Content-Type 消息头表示上传的数据类型是二进制数据,Content-Range 消息头表示上传的文件块的范围。

在这个示例中,我们将文件分成若干块,每块大小为 1MB。我们使用 File API 中的 slice 方法截取文件块,并使用 XMLHttpRequest 将文件块上传到服务器。

注意,这只是一个简单的实例,代码仅供参考,在实际应用中还需要考在考虑以下几点:

如果服务器端支持断点续传,可以在服务器端记录已经上传的文件块,避免重复上传。需要考虑如何处理上传失败的文件块,是否需要重试。在上传过程中需要提供进度条,让用户了解上传进度。在上传完成后需要有反馈,告知用户上传是否成功。服务器端如何处理上传的文件块,将其合并成一个完整的文件。服务器端存储空间的问题。可以使用分布式文件系统(如 HDFS)或云存储(如 Amazon S3)来存储上传的文件。文件块上传顺序、文件块校验、断点续传等问题。

通过分块上传的方式,我们可以将大文件分成若干块上传,避免一次性上传大文件造成的超时或者内存不足的问题,同时也方便实现断点续传和上传进度的显示。

除了上面提到的方法外,还可以使用第三方库来实现大文件上传。常见的第三方库有:

resumable.jspluploadfine-uploadertus-js-client

这些库都提供了文件分块、断点续传、上传进度等功能,可以让你更快捷地实现大文件上传。

不过要注意的是,使用第三方库可能会增加代码的复杂性和对第三方库的依赖。在选择使用第三方库时需要权衡其优缺点,并确保它满足你的需求。

2.2、后端实现代码

Java 后端代码示例:

import java.io.IOException;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItemIterator;import org.apache.commons.fileupload.FileItemStream;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.io.IOUtils;public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 保存所有分块数据,使用ConcurrentHashMap保证线程安全 private Map<String, byte[]> chunks = new ConcurrentHashMap<>(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (!ServletFileUpload.isMultipartContent(request)) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Not a multipart request"); return; } ServletFileUpload upload = new ServletFileUpload(); try { FileItemIterator iter = upload.getItemIterator(request); while (iter.hasNext()) { FileItemStream item = iter.next(); if (!item.isFormField()) { // 处理文件分块 processFilePart(item); } } } catch (Exception e) { e.printStackTrace(); } } private void processFilePart(FileItemStream item) throws Exception { String index = item.getFieldName(); byte[] data = IOUtils.toByteArray(item.openStream()); chunks.put(index, data); // 如果所有分块都已经上传完成,合并所有分块并保存文件 if (isAllChunksUploaded()) { // 合并所有分块并保存文件 mergeAndSaveFile("/path/filename.suffix"); } } private boolean isAllChunksUploaded() { // 判断是否所有分块都已经上传完成 int totalChunks = getTotalChunks(); for (int i = 0; i < totalChunks; i++) { if (!chunks.containsKey(String.valueOf(i))) { return false; } } return true; } public void mergeAndSaveFile(String fileName) throws Exception { int totalChunks = getTotalChunks(); int totalFileSize = getTotalFileSize(); byte[] mergedFile = new byte[totalFileSize]; int index = 0; for (int i = 0; i < totalChunks; i++) { byte[] chunkData = chunks.get(String.valueOf(i)); System.arraycopy(chunkData, 0, mergedFile, index, chunkData.length); index += chunkData.length; } saveFileToLocal(mergedFile, fileName); } private void saveFileToLocal(byte[] fileData, String filePath) throws Exception { try (FileOutputStream fos = new FileOutputStream(filePath)) { fos.write(fileData); } } private int getTotalChunks() { // You need to implement this method return 0; } private int getTotalFileSize() { // You need to implement this method return 0; }}

这只是一个示例代码,不是完整的项目。该代码使用了 Apache Commons FileUpload 库,在运行该代码之前请确保已经引入了该库。该代码实现了分块上传的主要逻辑,包括存储分块数据,合并所有分块并保存文件,以及判断是否所有分块都已经上传。

请注意,上面的代码中的 getTotalChunks 和 getTotalFileSize 方法需要您自行实现。它们将分别用于获取总分块数和总文件大小,这些信息可以通过前端预先发送给后端或从数据库中查询获得。

关于文件上传需要了解的知识点:

HTML5 文件上传文件上传技术文件上传安全性分块上传断点续传云存储

二、文件下载

在 JavaScript 中实现文件下载,常见的方法如下:

1、使用 window.location 实现:通过更改当前页面的 URL 为文件下载地址,从而实现下载。

window.location = 'file-download-url';

 2、使用 a 标签实现:通过创建一个 a 标签并设置其 href 和 download 属性,从而实现下载。

var link = document.createElement("a");link.download = "filename";link.href = "file-download-url";link.click();

 3、使用 fetch API 实现:通过使用 fetch API 获取文件内容,并将其写入 Blob 对象,最后利用 URL.createObjectURL 将其下载。

fetch('file-download-url') .then(response => response.blob()) .then(blob => { const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = 'filename'; link.click(); URL.revokeObjectURL(url); document.body.removeChild(link); });
本文链接地址:https://www.jiuchutong.com/zhishi/295854.html 转载请保留说明!

上一篇:尚硅谷vue笔记 详细讲解版(尚硅谷 天禹老师)(尚硅谷docker笔记)

下一篇:ChatGLM-6B (介绍以及本地部署)

  • lpddr5和lpddr4x的区别(lpddr5 和lpddr4x)

    lpddr5和lpddr4x的区别(lpddr5 和lpddr4x)

  • 手机屏幕边有白色亮线(手机屏幕边有白边)

    手机屏幕边有白色亮线(手机屏幕边有白边)

  • 怎么改变表格的行高(怎么改变表格的只读模式)

    怎么改变表格的行高(怎么改变表格的只读模式)

  • 苹果8p怎么固定亮度(苹果8plus怎么固定屏幕不旋转)

    苹果8p怎么固定亮度(苹果8plus怎么固定屏幕不旋转)

  • 毒上的三种发货有啥区别(毒的三种发货方式有什么区别)

    毒上的三种发货有啥区别(毒的三种发货方式有什么区别)

  • 电脑tpm设备是什么

    电脑tpm设备是什么

  • 乐视x501是什么型号的(乐视x501参数配置)

    乐视x501是什么型号的(乐视x501参数配置)

  • 三星exynos980相当于麒麟多少(三星EXynos980相当于骁龙多少)

    三星exynos980相当于麒麟多少(三星EXynos980相当于骁龙多少)

  • 打印机不吸纸是什么原因(打印机不吸纸是什么原因 惠普108)

    打印机不吸纸是什么原因(打印机不吸纸是什么原因 惠普108)

  • iphone11耳机怎么用(iphone11耳机怎么调)

    iphone11耳机怎么用(iphone11耳机怎么调)

  • 8p长度(苹果8p长度)

    8p长度(苹果8p长度)

  • ipad取消订阅在哪(ipad的订阅取取消了还有怎么办)

    ipad取消订阅在哪(ipad的订阅取取消了还有怎么办)

  • 苹果蓝牙耳机怎么分辨真假(苹果蓝牙耳机怎么使用)

    苹果蓝牙耳机怎么分辨真假(苹果蓝牙耳机怎么使用)

  • ps里样机怎么用(ps样机怎么用ai贴图)

    ps里样机怎么用(ps样机怎么用ai贴图)

  • 苹果平板怎么下载软件(苹果平板怎么下载微信)

    苹果平板怎么下载软件(苹果平板怎么下载微信)

  • 苹果手机怎么传送照片(苹果手机怎么传到安卓手机)

    苹果手机怎么传送照片(苹果手机怎么传到安卓手机)

  • 手机膜有什么用(手机贴膜哪种膜最好)

    手机膜有什么用(手机贴膜哪种膜最好)

  • 如何改qq账号上限数量(qq的账号怎么改)

    如何改qq账号上限数量(qq的账号怎么改)

  • set协议定义(set协议的相关方有哪些)

    set协议定义(set协议的相关方有哪些)

  • 戴尔电脑怎么分盘(戴尔电脑怎么分屏一半一半)

    戴尔电脑怎么分盘(戴尔电脑怎么分屏一半一半)

  • 淘宝版本怎么切换(淘宝版本怎么切换到老版本)

    淘宝版本怎么切换(淘宝版本怎么切换到老版本)

  • QQ朋友坦白局会不会知道是谁(qq朋友坦白局怎么看回复)

    QQ朋友坦白局会不会知道是谁(qq朋友坦白局怎么看回复)

  • 12306如何开通人脸识别(怎样开启12306的人脸识别)

    12306如何开通人脸识别(怎样开启12306的人脸识别)

  • 苹果x频繁自动关机解决办法(iphone x老是自动重启)

    苹果x频繁自动关机解决办法(iphone x老是自动重启)

  • 滴滴可以中途改地址吗(滴滴可以中途改地址几次)

    滴滴可以中途改地址吗(滴滴可以中途改地址几次)

  • 最大单反相机镜头是什么(单反镜头直径越大是不是就越好)

    最大单反相机镜头是什么(单反镜头直径越大是不是就越好)

  • 如何挽留婚姻,如何拯救您的婚姻?(如何挽留婚姻危机)

    如何挽留婚姻,如何拯救您的婚姻?(如何挽留婚姻危机)

  • 波来古市附近的Chu Dang Ya火山,越南嘉来 (© Quang Ngoc Nguyen/Alamy)(波来古市在哪里)

    波来古市附近的Chu Dang Ya火山,越南嘉来 (© Quang Ngoc Nguyen/Alamy)(波来古市在哪里)

  • python中Sobel算子如何使用(sobel算子 opencv)

    python中Sobel算子如何使用(sobel算子 opencv)

  • 购买土地税率是多少
  • 企业所得税要交多少税
  • 个人劳务票必须本人开吗
  • 个体工商户收入怎么核定
  • 纳税申报表上的二维码有什么用?
  • 利润表季报的本期金额是本年累计吗
  • 福利费需要申报吗
  • 普通发票不能抵扣进项税额怎么做账
  • 冲红票需要给购方吗
  • 保本销售量的计算公式用安全边际率
  • 免抵退税办法不得抵扣的进项税额包含了什么业务
  • 增值税组成计税价格包括消费税吗
  • 员工离职如何申请赔偿
  • 没有营业收入要报税吗
  • 现金日记账年结图片
  • 报销跨月还能报销吗
  • 筹备期会计分录
  • 现金折扣税前扣除
  • 事业单位收到增资款
  • 增值税电子发票怎么开具流程
  • 成本票和专票区别
  • 收到的发票开票人是管理员,这样可以吗?
  • 个人取得利息需要缴纳增值税吗
  • 企业自行建造的固定资产
  • 多计提企业所得税费用会计分录
  • 机械设备已使用怎么处理
  • 食用盐的增值税是多少
  • 小规模补缴增值税怎么算
  • 个人所得税代扣代缴的适用范围
  • PHP:oci_num_fields()的用法_Oracle函数
  • 小规模纳税人免征增值税的账务处理
  • apache24启动不了错误代码1
  • 利用的英文
  • 栗耳簇舌巨嘴鸟,巴西潘塔纳尔保护区里 (© Ana Gram/Shutterstock)
  • 顺流交易逆流交易未实现内部交易损益
  • netddeclnt.exe - netddeclnt是什么进程 有什么用
  • 数据库olap
  • 销售商品怎么做会计分录呢
  • 君子兰的养殖方法
  • 机动处置什么意思
  • 计入当期损益的利得分录
  • python PaddleOCR库的介绍
  • 公司内控制度由谁制定
  • 个人所得税计算方法及抵扣方法
  • 查询sqlserver数据库开发这门课程的最高分
  • 资产处置收益的核算内容
  • 淘宝上买资料可以退吗
  • 土地出让金如何缴纳
  • 应交税费如何做到账表一致
  • 个人咨询费发票怎么开
  • 预收款开票的会计分录
  • 运费少给怎么办
  • 利润所得税费用
  • 建筑业农民工工资个税合理避税
  • 红字冲红什么意思
  • 支票丢失需要登报吗
  • 公账钱怎么取出
  • 机械租赁怎么开9个点
  • 总账建账要建全部科目吗
  • 年数总和法计提折旧的例题
  • mysql5.7.33安装配置教程
  • utilman.exe - utilman是什么进程
  • Win8系统筛选器Smartscreen阻止恶意程序运行
  • linux命令ls-l
  • giantantispywaremain.exe是什么进程 有什么作用 giantantispywaremain进程查询
  • win10系统光驱
  • linux里chmod
  • windows mobile
  • jsp中onload事件
  • unity连接
  • vue轮播图插件有哪些
  • javascript的sort
  • android中handler机制
  • js日期格式化方法
  • js与jquery的关系
  • jquery基本知识
  • android入门教程
  • javascript面向对象精要
  • 出租车票如何验真
  • 营改增之前和之后
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设