websocket上传文件

nginx的上传
查看[url]http://haoningabc.iteye.com/blog/2344484[/url]
效果如图
[img]http://dl2.iteye.com/upload/attachment/0121/9935/3e522bf6-b489-3503-9eb9-148c301e5a3b.png[/img]
这几天有个需求
上传大文件,需要带进度条,
nginx这个版本有7,8年了,担心有bug,不如用websocket重新写一个
原理
使用websocket.jar
前端需要分片,把一定字节的用websocket传过去
后端用流顺序写到文件里面
(理论上,如果用session把当前存的字节数就可以断点续传)
html代码如下:

<!DOCTYPE html>
<html>
<head>
<title>WebSocket Chat Client</title>
<meta charset="utf-8" />
<script type="text/javascript" src="jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="jquery.json-2.3.js"></script>
<script type="text/javascript">
$().ready(
function() {
          if (window.File && window.FileReader && window.FileList
&& window.Blob) {
} else {
alert('The File APIs are not fully supported in this browser.');
}
});

//在消息框中打印内容
function log(text) {
$("#log").append(text+"\n");
}

//全局的websocket变量
var ws;
var paragraph = 10485760;
//var paragraph = 1024;
var fileList ;
var file;
var startSize,endSize = 0;
var i = 0; j = 0;
//连接服务器
$(function() {
$("#connect").click(function() {
ws = new WebSocket($("#uri").val());
//连接成功建立后响应
ws.onopen = function() {
log("成功连接到" + $("#uri").val());
}
//收到服务器消息后响应

ws.onmessage = function(e) {
console.log("iiiiiiiiii:"+i);
log("服务器说" + e.data + " "+(e.data=="ok"));
if((e.data+"") == "ok"){
if(endSize < file.size){
console.log("file.size:"+file.size);

startSize = endSize;
endSize += paragraph ;
console.log("startSize:"+startSize);
console.log("endSize:"+endSize);
console.log("file---haha----:"+file);
document.getElementById('progress').innerHTML=Math.round(startSize / file.size * 10000) / 100.00 + "%";
if (file.webkitSlice) {
console.log("webkitSlice--->");
var blob = file.webkitSlice(startSize, endSize);
} else if (file.mozSlice) {
console.log("mozSlice--->");
var blob = file.mozSlice(startSize, endSize);
}else {
console.log("Slice--->");
var blob = file.slice(startSize, endSize);
}
var reader = new FileReader();
reader.readAsArrayBuffer(blob);
reader.onload = function loaded(evt) {
var ArrayBuffer = evt.target.result;
log("发送文件第" + (i++) + "部分");
ws.send(ArrayBuffer);
}
}else{
console.log("endSize >= file.size-->"+e.data+"<---");
console.log("endSize >= file.size-->endSize:"+endSize);
console.log("endSize >= file.size-->file.size:"+file.size);
startSize = endSize = 0;
i = 0;
log("发送" + file.name +"完毕");
log("发送文件完毕");
}
}
//连接关闭后响应
ws.onclose = function() {
log("关闭连接");
ws = null;
}
return false;
}
});
});
$(function() {
$("#sendFileForm").click(function() {
fileList = document.getElementById("file").files;
file = fileList[0];
ws.send(file.name);

})
});
$(function() {
$("#reset").click(function() {
$("#log").empty();
return false;
});
});
</script>
</head>
<body>
<span>上传的百分比</span>
<span id="progress">0</span><br>
<input type="text" id="uri" value="ws://localhost:8887"
style="width: 200px;"> <input type="button" id="connect"
value="Connect"><input type="button" id="disconnect"
value="Disconnect" disabled="disabled"><!--ws://192.168.137.178:8081/websocketchat/hao/binupload?r=haha-->
<form >
<input id="file" type="file" multiple />
<input type="button" id="sendFileForm" value="测试" />
<input type="button" id="reset" value="清空消息框" />
</form>
<form>
<textarea id="log" rows="30" cols="100"
style="font-family: monospace; color: red;"></textarea>
</form>
</body>
</html>


java的服务端代码如下

package testupload;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.nio.channels.NotYetConnectedException;
import java.util.Set;
import org.java_websocket.WebSocket;
import org.java_websocket.WebSocketServer;
import org.java_websocket.handshake.ClientHandshake;
public class UploadServer extends WebSocketServer {
public UploadServer(int port) throws UnknownHostException {
super(new InetSocketAddress(InetAddress.getByName("192.168.137.178"), port));
}
public UploadServer(InetSocketAddress address) {
super(address);
}
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
try {
this.sendToAll("new");
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println(conn + " entered the room!");
}
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
try {
this.sendToAll(conn + " has left the room!");
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println(conn + " has left the room!");
}
public String fileName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
@Override
public void onMessage(WebSocket conn, String message) {
// try {
// this.sendToAll( message );
// } catch ( InterruptedException ex ) {
// ex.printStackTrace();
// }
// System.out.println( conn + ": " + message );
System.out.println("文件名" + message);
// 将文件名写入连接对象中,(需要手动修改webSocket类)
this.setFileName(message);
try {
conn.send("ok");
} catch (NotYetConnectedException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void onMessage(WebSocket conn, byte[] message) {
System.out.println("收到二进制流:");
// 将二进制流保存为文件, 文件名从连接对象中取出
saveFileFromBytes(message, "D:/c/apache-tomcat-7.0.62/webapps/websocketchat/src/" + this.getFileName());
// 告诉前台可以继续发送了.
try {
conn.send("ok");
} catch (NotYetConnectedException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static boolean saveFileFromBytes(byte[] b, String outputFile) {
FileOutputStream fstream = null;
File file = null;
try {
file = new File(outputFile);
fstream = new FileOutputStream(file, true);
fstream.write(b);
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (fstream != null) {
try {
fstream.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
return true;
}
@Override
public void onError(WebSocket conn, Exception ex) {
ex.printStackTrace();
}
public void sendToAll(String text) throws InterruptedException {
Set<WebSocket> con = connections();
synchronized (con) {
for (WebSocket c : con) {
c.send(text);
}
}
}
public static void main(String[] args) throws InterruptedException, IOException {
WebSocket.DEBUG = true;
int port = 8887;
try {
port = Integer.parseInt(args[0]);
} catch (Exception ex) {
}
UploadServer s = new UploadServer(port);
s.start();
System.out.println("UploadServer started on port: " + s.getPort());
// 服务端 发送消息处理部份
BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String in = sysin.readLine();
s.sendToAll(in);
}
}

}

只需要一个jar
websocket.jar
[url]http://dl.iteye.com/topics/download/decd7d91-9d2a-381f-bcea-fb0e202f6e3c[/url]
cesium 深度图(获取区域最高最低点位) 文章摘要: Cesium深度图技术可用于获取区域地形高程数据,核心实现步骤包括:1)通过离屏相机构建独立渲染环境,使用正交投影确保采样精度;2)采用离屏渲染技术获取均匀分布的地形点数据。关键技术点包含多边形外包矩形计算、后台相机配置(5km高度正交投影)、1024×1024像素离屏视图设置,以及深度数据解析(RGBA格式转换和三维坐标还原)。该方法避免了主视图干扰,可精准获取区域内地形高程信息,为填挖方分析等应用提供基础数据支持。 阅读详情

相关推荐

mysql笔记:23. 在Mac上安装与卸载MySQL

MySQL对Mac电脑的适配十分强大,再加上Mac本身就是Unix操作系统演化而来的,所以在Mac上安装MySQL的方式有多种。常见的方法有如下三种:DMG、brew、TAR。介绍这些方法前,我们先了解下MySQL安装文件的下载。

斌斌(Java) 2249

websocket实现web上传文件进度条

websocket实现web上传文件进度条

lizhi1030的博客 2342

【软考高项】五十一、常见必会的几种进度网络图(单代号、双代号、七格图、横道图)

软考高项计算题进度网络图画图介绍

有莘不破的博客 3万+

如何高效的上传大文件?

超大文件如何高效上传到服务器?

qq_41267876的博客 2627

DDR5内存调优实战:手把手教你搞定Write Leveling Training Mode(附时序图解析)

本文深入解析DDR5内存调优中的Write Leveling Training Mode技术,详细介绍了其核心原理、硬件准备、实战步骤及常见问题解决方案。通过JESD79-5标准定义的反馈机制,帮助硬件工程师精确对齐DQS与CK信号,提升系统稳定性和数据可靠性。附有时序图解析和代码示例,适合DDR5内存系统设计与调试参考。

weixin_29256771的博客 550

滑模控制概述

滑模控制概述1.滑模控制概念2.滑模控制原理3.滑模控制设计步骤4.研究现状5.发展趋势5.1自适应滑模变结构控制5.2模糊滑模控制5.3神经网络与滑模控制的结合 1.滑模控制概念   滑模控制(Sliding Mode Control,SMC)是一种特殊类型的变结构控制(Variable Structure Control,VSC),因此又称之为滑模变结构控制,是近年来广泛应用和发展的一种控制方法。滑模控制本质上是一种非线性控制,即控制结构随时间变化而变化。滑模变结构控制是非线性系统中普遍采用的一种分析方

shiyi20190828的博客 2万+

websocket 传输文件

上一章实现了websocket传输文本信息,实际上网络传输的都是二进制0和1,因而也可以传输文件。实际上websocket是tcp上的双工协议,传输文件是没有问题的,只是需要定义应用层协议才行。如果使用Tomcat的websocket传输,注意传输内容大小。而且HTTP2.0和HTTP3.0并不能使用websocket,尤其是http3.0UDP协议。httpshttpshttps。...

fenglllle的博客 1万+

STM32H743 SD卡读写避坑实录:CubeMX配置MDMA给FATFS,我的FreeRTOS项目踩了哪些雷?

本文详细解析了STM32H743在CubeMX配置中结合SDMMC、MDMA与FATFS的实战避坑指南,特别针对FreeRTOS环境下的SD卡读写问题提供了解决方案。从时钟配置到FATFS参数设置,再到DMA缓存维护和FreeRTOS集成技巧,帮助开发者高效解决数据损坏、DMA传输错误等常见问题,提升项目稳定性。

weixin_30878501的博客 494

springboot整合websocket(三)上传文件(引导篇)

springboot整合websocket(二) springboot整合websocket(一) 接上一章,这次我们把文件上传的坑给填了 1、回顾一下 上次提到有一个方法: void onMessage(Session session, byte[] message); 这个是用来上传文件用的,先解释一下 byte[] 这个参数。 好吧~ 大家猜的没错,这个就是我们文件的二进制流。 所以说,我们要干两件事: 第一,我们js要获得文件,并转成二进制流发过来 第二,在上传之前,我们需要知道文件的名字,因

qq_44938451的博客 5226

雷达参数的设置

采样率又可以叫做采样速率或者,顾名思义就是每秒采集的次数。该值越高,单位时间内对信号的采集越多,采样率的单位可以用Hz或者sps表示(sps是采样率,是每秒采样点的数量,sp表示采样点数),一般1sps=1Hz。采样时间是采样点数和采样周期的乘积得到的结果。假设实际采样率为4560ksps,采样点数为256,那么采样周期为1/4560(ms),那么ADC的采样时间就为256*(1/4560)(ms)=0.056ms=56微秒。

qq_50974341的博客 1912

海外购物商城源码 带即时通讯IM源码

在海外购物商城中,即时通讯IM源码可以为用户提供更便捷、高效的沟通方式,帮助解决跨国交易中的语言和文化差异问题。总之,即时通讯IM源码在海外购物商城中扮演着重要的角色,可以为用户提供更方便、高效的沟通方式,解决跨国交易中的语言和文化差异问题。(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买)实时翻译:即时通讯IM源码提供实时翻译功能,能够快速准确地翻译不同语言之间的文字、语音、视频等信息,帮助用户克服语言障碍。

很酷的站长的博客 259

springboot整合websocket上传文件

springboot整合websocket上传文件

qq_37705525的博客 892

点云配准3:3d-ndt算法在pcl上的实现以及参数设置

3d-ndt算法在pcl上的使用方法以及参数设置

诺有缸的高飞鸟的博客 7891

java websocket 上传文件_使用Html5的WebSocket在浏览器上传文件

文件上传的步骤: 打开websocket--连接websocket服务器--在浏览器里选择文件--将文件读入到内存中(以arraybuffer的形式)--在socket里发送文件--完毕!服务器端:先配置好websocket的服务器, 这里用一个java的开源websocket服务器:Java-WebSocket根据该项目的快速教程可以建立一个websocket服务器, 就是里面的一个ChatS...

weixin_42226116的博客 3287

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

基于websocket 文件断点上传

对于打文件上传如果网突然断了,得重新来一遍,是不是很郁闷,怎么办,如果浏览器不支持FileAPI 那就只能使用 Flash来做断点上传,有了HTML5 基于Ajax或者WebSocket 的原生实现也很棒。 下面就是基于websocket  + spring 的一个实现例子   好了直接上代码 &lt;!--     文件上传例子     使用websocket上传文件     支持...

anole2012的博客 1025

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

websocket多个房间php,H5+WebSocket多文件同时上传

这次给大家带来H5+WebSocket多文件同时上传,H5+WebSocket多文件同时上传的注意事项有哪些,下面就是实战案例,一起来看一下。在传统的HTTP应用上传文件想要同时上传多个文件并查看上传进度是一件很麻烦的事情,当然现在也有一些基于SWF的文件上传组件提供这种的便利性.到了HTML5下对文件的读取和上传的控制方面就非常灵活,HTML5提供一系列的AIP进行文件读取,包括计取文件某一块的...

weixin_39822673的博客 246

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HTML5 - WebSocket实现多文件同时上传

在传统的HTTP应用上传文件想要同时上传多个文件并查看上传进度是一件很麻烦的事情,当然现在也有一些基于SWF的文件上传组件提供这种的便利性.到了HTML5下对文件的读取和上传的控制方面就非常灵活,HTML5提供一系列的AIP进行文件读取,包括计取文件某一块的内容也非常方便,结合Web...

chongxungu8275的博客 244

HTML5-WebSocket实现多文件同时上传

在传统的HTTP应用上传文件想要同时上传多个文件并查看上传进度是一件很麻烦的事情,当然现在也有一些基于SWF的文件上传组件提供这种的便利性.到了HTML5下对文件的读取和上传的控制方面就非常灵活,HTML5提供一系列的AIP进行文件读取,包括计取文件某一块的内容也非常方便,结合Websocket进行文件的传输就变得更加方便和灵活.下面通过使用HTML5结合websocet简单地实现多文件...

dcnna0422的博客 389

Netty: websocket 文件分段上传

阅读原文 简介 前端用 Blob 分割文件,定义好每一段数据的大小,首先要把文件信息,包括文件名、文件大小、校验值、分段大小等信息发给服务器。然后是执行每一段的发送任务,可异步(有待研究,是开多个ws连接还是?????)也可同步(服务端最好要有回应事件),异步的话需要注意文件段的顺序,最好的话同步异步都用自己定义个格式帧去传输,方便校验。这里是简单版的,直接发送,没有校验! 还有,分段下载也是一样的操作~ 前端 前端用的是 ant-design-vue upload组件,customRequest自定义上

三生万物 1998

websocket 文件上传

<template> <divclass="pad20"> <inputid="file"ref="file"type="file"/> <buttonid="send"@click="send">发送</button> <divid="progress">{{progress}}</div> <div>{{(endTime-startT...

zheng156438的博客 1865

springboot整合websocket(四)上传文件(终篇)

springboot整合websocket(三)上传文件(终篇) springboot整合websocket(一)简单聊天室 springboot整合websocket(二)上传文件(引导篇) 说明 这里就涉及到一个问题,文件保存在服务器,前端页面要等后端保存完了之后,再发送下一份。 而前端想要接收服务器的消息,只能在OnMessage,所以我们需要改3个地方 前端webSocket.onmessage()方法里面,我们需要判断一下,哪些消息是显示的,哪些消息是发送下一份文件 这个采用的就是Messa

qq_44938451的博客 4683

php swoole上传文件,Swoole实验室:7-使用Websocket上传文件(1)

服务端我们继续使用Swoole实验室:1-使用Composer构建项目构建好的项目,新建文件\src\App\Uploader.php:namespace Helloweba\Swoole;use swoole_websocket_server;class Uploader{protected $ws;protected $host = '0.0.0.0';protected $port = 95...

weixin_35828255的博客 757

前端实现websocket之文件分片上传

3、当所有文件片段接收完成后,后端将文件拼接为完整文件,并进行校验(如哈希校验)确保文件完整性。方法发送每个文件片段,为确保片段顺序和完整性,通常会给每个片段附加一个序号或 ID。1、后端 WebSocket 服务器接收每个文件片段,并逐步将它们保存到服务器上。2、在接收过程中,后端需要跟踪文件片段的序号,确保数据的正确拼接顺序。4、当分片文件上传完成后,请求合并接口后端进行文件合并处理即可。2、进行分片设置,利用Blob的slice方法进行文件分片处理。1、通过DOM获取文件对象,并且对文件进行。

m0_71288644的博客 1038

java websocket 上传大文件,websocket与html5实现批量大文件逐…

websocket与html5实现批量大文件逐…jsp 代码(由于直接使用html元素上传会出问题,此处使用工具转化成图片):java服务端代码如下,使用net.sf.json相关的jar包和maven下的Java-WebSocket-1.3.1-SNAPSHOT.jar,低版本jdk可能不支持,此处使用1.8版本jdk环境package controller;import java.io.Buf...

weixin_30539081的博客 873

springboot里使用websocket实现文件上传并且显示进度

首先,我们清晰一下思路 1)先实现文件上传,我们应该清楚,文件上传和进度走的是两条路线,即异步; 2)再使用文件上传解析器去获取文件进度信息,这个信息是保存在一个session域里的,会被实时刷新; 3)websocket定时遍历,实现点对点发送上传进度信息; 很简单,就这三步 接下来开始实现 所需的maven依赖 <!--文件上传--> &l...

flykoala 6590

java websocket 上传大文件,使用java websocket API和Javascript上传文件

我正在学习websocket并且已经使用websocket / json完成了聊天程序.但我坚持上传ATM的文件.任何建议&回答会很感激.服务器端:package websocket;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io....

weixin_39789042的博客 1446
上一篇: nginx带进度条的上传超大文件
下一篇: jslinux-deobfuscated-network
linux内核控
博客等级 码龄19年 41粉丝 638原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值