一、概述

需求:通过html+js+java上传最大500M的文件,需要做MD5 消息摘要以及SHA256签名,文件上传至云存储

1.1、理解http协议

https://www.cnblogs.com/bjlhx/category/1198166.html

http传输的都是二进制数据,可以看成传输的都是字符。

http协议其实就是对socket接受到的数据进行解析,或者将按照http协议的格式把数据写到socket中

HTTP文件上传是做Web开发时的常见功能,例如上传图片、上传影片等。实现HTTP文件上传也比较简单,用任何Web端的脚本都可以轻松实现,例如PHP、JSP都有现成的函数或者类来调用。

经过分析后发现,原来PHP、JAVA的上传是先由服务器缓存为临时文件,或者服务器将上传数据缓存到内存中后,再由脚本调用相关的上传文件处理函数来移动临时文件来保存文件数据;由于PHP、JAVA等处理文件上传需要分两步,对于大文件与超大文件来说, 再次移动文件也是比较耗时间与系统资源的,由于浏览器将文件提交到服务器上后就会等待服务器端的响应,服务器端移动文件耗时太长,导致浏览器等待超时而报错。

1.2、HTTP文件上传的技术原理

HTTP文件上传是通过  multipart/form-data 协议实现的,multipart/form-data实际上是一种数据的编码分割方式,例如在浏览器端编写一个文件上传的页面,向服务器发送POST请求后,服务器端将会收到数据。

multipart/form-data需要首先在HTTP请求头设置一个分隔符,例如:WebKitFormBoundarydCC44akR5BzKXSP1:参看请求头数据

然后,将每个字段用“--分隔符”分隔,最后一个“--分隔符--”表示结束。

例如,要上传一个name字段"Today"和一个文件11.gif,HTTP正文可以通过Chrome浏览器开发者工具查看【F12】,目前我使用的没有展示Request  Payload ,可以使用wireshark抓包查看

1.2.1、wireshark 配置抓包:tcp.port eq 8080

打开网站

点击上传文件按钮

分析

1、三次握手建立tcp链接:57行,客户端发送syc,58行服务端回复syc和ack,59行客户端回复ack,其中60行  TCP Window Update:滑动窗口为0后,发送方停止发送数据,如果接收方滑动窗口出现空闲空间,则接收方主动发送TCP Window Update来更新发送方的滑动窗口。

2、数据传输:61行,Push+ACK包:数据包协议+ACK包,这样是为了减少网络流量;62行,服务器端返回ack,63行,具体数据传输,以及ack,后续就是没三行一次的循环上传数据

1.2.2、配置查看 TCP 流

查看整个请求响应过程【文件流删除大部分内容】

POST /manage/uploadFile HTTP/1.1

Host: zs.jd.com:8080

Connection: keep-alive

Content-Length: 335334

Cache-Control: max-age=0

Origin: http://zs.jd.com:8080

Upgrade-Insecure-Requests: 1

Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywcj3RACSzuBGHt5g

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

Referer: http://zs.jd.com:8080/file.html

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

------WebKitFormBoundarywcj3RACSzuBGHt5g

Content-Disposition: form-data; name="name"

sss

------WebKitFormBoundarywcj3RACSzuBGHt5g

Content-Disposition: form-data; name="file"; filename="11.gif"

Content-Type: image/gif

GIF89a+...w..!..NETSCAPE2.0.......=;.@.;

------WebKitFormBoundarywcj3RACSzuBGHt5g--

HTTP/1.1 200

Transfer-Encoding: chunked

Date: Thu, 06 Jun 2019 02:24:05 GMT

0

GET /favicon.ico HTTP/1.1

Host: zs.jd.com:8080

Connection: keep-alive

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Accept: image/webp,image/apng,image/*,*/*;q=0.8

Referer: http://zs.jd.com:8080/manage/uploadFile

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

HTTP/1.1 200

X-Content-Type-Options: nosniff

X-XSS-Protection: 1; mode=block

Cache-Control: no-cache, no-store, max-age=0, must-revalidate

Pragma: no-cache

Expires: 0

X-Frame-Options: DENY

Content-Length: 0

Date: Thu, 06 Jun 2019 02:24:05 GMT

二、代码开发

2.1、jar配置

POM jar

commons-fileupload

commons-fileupload

1.3.1

commons-io

commons-io

2.5

因为使用springboot,配置基础参数

spring.http.multipart.max-file-size=500MB

spring.http.multipart.max-request-size=500MB

代码类:只要是Spring 生态的应用程序,文件的接收都是使用MutipartFile这个类型,它表示通过 mutipart 请求上传了的一个文件。如果多个文件上传,那就用数组,如 MutipartFile[] 。

2.2、基本上传

html

姓名:上传文件:

java代码

util方法

import java.io.*;importjava.security.MessageDigest;importorg.apache.commons.codec.binary.Hex;public classCommonHelper {public static String msgSafeBase(String msg, String algorithmName) throwsException {return msgSafeBase(msg.getBytes("UTF8"), algorithmName);

}public static String msgSafeBase(byte[] data, String algorithmName) throwsException {

MessageDigest m=MessageDigest.getInstance(algorithmName);

m.update(data);byte s[] =m.digest();returnHex.encodeHexString(s);

}public static String msgSafeBase(InputStream inputStream, String algorithmName) throwsException {

MessageDigest m=MessageDigest.getInstance(algorithmName);//分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。

byte[] buffer = new byte[1024];int length = -1;while ((length = inputStream.read(buffer, 0, 1024)) != -1) {

m.update(buffer,0, length);

}

inputStream.close();byte s[] =m.digest();returnHex.encodeHexString(s);

}public static String msgSafeBaseMD5(byte[] data) throwsException {return msgSafeBase(data, "MD5");

}public static String msgSafeBaseMD5(InputStream inputStream) throwsException {return msgSafeBase(inputStream, "MD5");

}public static String msgSafeBaseSHA256(byte[] data) throwsException {return msgSafeBase(data, "SHA-256");

}public static String msgSafeBaseSHA256(InputStream inputStream) throwsException {return msgSafeBase(inputStream, "SHA-256");

}

}

View Code

接收方法

@RequestMapping("/uploadFile/cloud2")

public Object bigFile(HttpServletRequest request, HttpServletResponse response, String guid, String md5,

Integer chunk, @RequestParam(required = false, value = "file") MultipartFile file, Integer chunks) {

String baseMD5 = CommonHelper.msgSafeBaseMD5(file.getBytes());

String sha256 = CommonHelper.msgSafeBaseSHA256(file.getBytes());

fIleResp.getData().setMd5(baseMD5);

fIleResp.getData().setSha256(sha256);

String s = fileService.upLoadFileStream(fileProperty, file.getInputStream(), file.getSize());

}

2.3、使用前端webuploader 不分片处理

Title

java spring js文件_005-html+js+spring multipart文件上传相关推荐

  1. android h5 多图上传源码,JS移动端/H5同时选择多张图片上传并使用canvas压缩图片...

    最近在做一个H5的项目,里边涉及到拍照上传图片的功能以及识别图片的功能,这里对识别图片的功能不做赘述,不属本文范畴.我在做完并上线项目后,同事跟我提了一个要求是可不可以同时选择多张图片上传,我做的时候 ...

  2. js插件+UploadFile类实现图片的批量上传

    文件上传无疑是web应用中一个非常常用的功能,下面小编给大家分享一下diyUpload.js+ThinkPHP中的UploadFile类实现图片的批量上传. 首先,给大家介绍展示一下具体操作页面: h ...

  3. vue本地上传并预览php,vue.js 实现图片本地预览 裁剪 压缩 上传功能

    以下代码涉及 Vue 2.0 及 ES6 语法. 目标 纯 javascrpit 实现,兼容ie9及以上浏览器,在本地做好文件格式.长宽.大小的检测,减少浏览器交互. 现实是残酷的,为了兼容Ie9 还 ...

  4. Asp.Net 上传大文件专题(4)--利用ajax技术显示上传进度

    ====================================================== 注:本文源代码点此下载 ================================= ...

  5. tp5.1 乐视云上传视频文件(https请求http乐视云上传接口)http网址下上传视频(https API接口)

    一.sdk_php_v2.0.zip 上传视频 网址:http://www.lecloud.com/zh-cn/help/api.html tp5.1 乐视云上传视频文件(https请求http乐视云 ...

  6. SpringBoot+Vue+mybatis生成pdf文件(表头跟页码,适应上传linux服务器后的操作)

    SpringBoot+Vue+mybatis生成pdf文件(表头跟页码,适应上传linux服务器后的操作) 为什么使用后端去生成 说明 依赖 后端目录 控制器代码 模板代码 前端代碼 最終效果 为什么 ...

  7. 文件传输服务器的默认端口,服务器上传文件端口

    服务器上传文件端口 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 安装传输工具 ...

  8. php ajax base64,jQuery实现文件编码成base64并通过AJAX上传的方法

    本文实例讲述了jQuery实现文件编码成base64并通过AJAX上传的方法.分享给大家供大家参考,具体如下: 使用AJAX是无法直接上传文件的,一般都是新建个iframe在它里面完成表单提交的过程以 ...

  9. 介绍一个工具给大家,做网站时,经常要上传文件到外网服务器,但是上传时往往需要很长时间,如果有一个文件对比工具……...

    介绍一个工具给大家,做网站时,经常要上传文件到外网服务器,但是上传时往往需要很长时间,如果有一个文件对比工具, 可以对比每次版本有什么文件变化,并单独找出来.这样只需要上传需求的文件就可以达到版本更新 ...

  10. 服务器上的文件夹设置ftp,设置ftp服务器上传文件夹

    设置ftp服务器上传文件夹 内容精选 换一换 监控数据上报功能可以将系统中采集到的监控数据写入到文本文件,并以FTP或SFTP的形式上传到指定的服务器中.使用该功能前,管理员需要在FusionInsi ...

最新文章

  1. 用tabbar mode为Emacs建立ta
  2. 11467人力资源统计学在计算机,2013年至2017年自考11467《人力资源统计学》真题及答案.pdf...
  3. react-router的基础知识
  4. 微信小程序学习:开发注意点
  5. ssh 三者集合的思想
  6. list index out of bounds_python3基础03列表(list)和元组(tuple)
  7. webpackjsonp 还原_具有催化CO2还原性能的非贵金属配合物的配体设计
  8. 驱动开发中常用的操作和小知识
  9. 学习date , clock , hwclork , cal, ls ,cd , pwd, tty, whereis , which ,stat, e
  10. metal分析是什么意思_GWAS数据如何做meta分析?
  11. Cadence16.6版本下Pspice仿真的使用
  12. 人工智能在计算机领域中的应用
  13. Form表单之get提交与post提交
  14. 汉字转拼音 python_python实现将汉字转换成汉语拼音的库
  15. C语言练习9—统计单词中字母个数
  16. React 生成二维码
  17. 如何提升订单周转,避免订单交期延误?
  18. linux系统中XLib在什么位置,什么是glibc?glibc是什么?什么是freetype?freetype是什么?什么是?Xlib是什么?什么是lo...
  19. Java经典面试题汇总(五)网络编程
  20. OWASP ZAP安全测试工具使用教程(初级)

热门文章

  1. linux开启启动服务的顺序,SUSE服务启动顺序
  2. VGG16+UNet个人理解及代码实现(Pytorch)
  3. 循环结构中的三大循环语句
  4. 一些非常激励人心的电子类同行成长经历
  5. 镇魂歌~Qt5容器类_1
  6. 80年代计算机机房,上世纪九十年代甩图版,计算机制图开始取代手工制图
  7. 在idea中移除子模块如何Moudle后重新导入
  8. linux系统英伟达gpu驱动卸载_Ubuntu 16.04 卸载Nvidia显卡驱动和cuda
  9. OpenCore黑苹果之拯救者14(HD4600)开启HDMI音频
  10. mysql 计算中位数_【转】MySQL如何计算中位数