块和分块服务

Dropzone.js分块上传视频的PHP实现 本文介绍了使用Dropzone.js和PHP实现视频分块上传的方法。分块上传通过将大文件分割成多个小块上传,提高了大文件传输的稳定性。文章详细说明了Dropzone.js的配置方法,并提供了PHP服务器端接收和处理分块文件的完整代码示例,包括如何追加文件块和判断上传完成。同时,文中还强调了服务器配置、错误处理和安全性等注意事项,为开发者提供了完整的解决方案,有效解决了大视频文件上传中的超时和中断问题。 阅读详情

本章中,首先将介绍块和分块服务的基本概念和原理,然后介绍如何在MapGuide Studio中通过用户界面来配置图层使用分块服务和如何通过MapGuide分块服务API来创建和使用块。

1.1  块

对于AJAX Viewer和Fusion Viewer,MapGuide服务器都是将地图渲染为一张图像发送给客户端的,每次当用户在浏览器中缩放或平移地图的时候,通常都会要求MapGuide服务器重新发送地图到客户端。试想一下,如果每次都重新渲染地图,这将是一个不小的开销。那么,是否可以将已经渲染好的地图缓存下来,当客户端浏览地图的时候直接从缓存中取出那些已经渲染好的地图,从而降低MapGuide服务器的开销。这个方案听起来是可行的,而且在许多的商业软件都使用了这样的技术,MapGuide也采用了类似的技术。

那么,MapGuide是如何缓存已经渲染为图像的地图的呢?在介绍MapGuide的缓存技术之前,让我们先看看它必须解决的问题。

问题1:在大部分情况下,客户端需要的只是当前视图中需要显示部分的地图,而不是整个地图,如何只把当前视图对应的地图图像返回给客户端?

问题2:地图中图层不同的可见性设置会导致不同的地图渲染结果,如何缓存这些不同的地图图像?

问题3:在不同的地图比例尺下,地图需要被渲染为不同分辨率的图像,以保证总能获得清晰的地图。地图比例尺是一个连续的值,所以不可能在所有的地图比例尺为地图创建缓存,那么又该如何解决这个问题呢?

1.1.1  块

对于问题1,MapGuide采用的办法是将整个地图分割为固定大小的图像块进行缓存,这样服务器只需要将客户端当前视图对应的图像块返回给客户端,而客户端可以立即显示返回的块,无需等待所有块全部返回才显示地图。

可以通过MapGuide服务器配置文件ServerConfig.ini中TileServiceProperties部分的属性设置块的大小, DefaultTileSizeX属性用于设置块的宽度,DefaultTileSizeY属性用于设置块的高度,它们的单位都为像素,默认值都为300。

1.1.2  基地图、基层和基层组

对于问题2,MapGuide引入了基地图(Bae Map)、基层(Base Layer)和基层组(Base Layer Group)的概念来解决这个问题。与地图的概念类似,基地图也是由图层组组成,每个图层组由若干个图层组成,我们将基地图中的图层组和图层分别称为基层组和基层。但是,基地图与地图并不是平行的概念,基地图只是地图的组成部分,图6-1显示了地图定义的Schema,可以看到每个地图可以包含一个基地图BaseMapDefinition。与普通地图不同的是:

l  基地图只能由基层组组成,不能直接包含一个基层。所以,在图6-1中可以看到,BaseMapDefinition只包含了BaseMapLayerGroup。

l  基层没有可见性设置,只有基层组具有可见性设置,基层的可见性由其所属的基层组决定。所以,在图6-1中可以看到,BaseMapLayerGroup包含Visible元素,而BaseMapLayer没有Visible元素。

 Map Definition Schema

 

图6-1 地图定义的Schema

 

由于只有基层组具有可见性设置,所以基础图层组的所有图层是在一起渲染。对于不同的基层组,它们被渲染为不同的图像块,缓存在不同的目录下。这样,就可以解决问题2。

假设基地图中包含了两个基层组,一个基层组为可见,一个为不可见,当使用Viewer浏览地图时,只需要将可见基层组缓存的块返回给客户端;如果两个基层组都可见,那么两个基层组缓存的块都会返回给客户端,如果高层的基层没有透明区域,底层的层会被高层的基层隐藏。

1.1.3  基地图比例尺

基地图具有一组预定义的比例尺,它们由图6-1中的FiniteDisplayScale元素所定义,MapGuide只将这些比例尺下的地图图像缓存下来。当Viewer发送请求来查看某个比例尺的地图时,MapGuide会在预定义的比例尺中查找最接近当前请求的比例尺,返回此比例尺下缓存的块,这样就解决了问题3。

1.1.4  创建基地图

MapGuide Studio提供了如图6-2所示的用户界面用于创建基地图,使用步骤如下:

1) 在MapGuide Studio中打开要添加基地图的地图。

2) 在Base Layers For Smooth Navigation面板中Layers By Group and Drawing Order下面,点击Base Layers(0 Groups, 0 Layers)。

3) 点击Create A New Group按钮,你创建任意多个基层组,但必须至少创建一个基层组,基层组之间不可以嵌套。

4) 添加图层到基层组,不要将已经在加入地图中的图层加入基层组。

5) 在Set Fixed Scales for Incremental Zooming面板的Total number of scales文本框中输入比例尺的数目,Studio会自动创建一系列平均间隔的比例尺,并将它们显示在Generated scale list列表框中。

6) 保存对当前地图的修改。

 UI to Create Base Map

 

图6-2 创建基地图的用户界面

1.2  块的缓存位置

块在MapGuide服务器中的缓存路径由如下五部分组成:

l  文件基路径

l  基地图比例尺索引

l  基层组

l  行

l  列

1.2.1  文件基路径

如果是Library资源库,那么文件基路径等于地图资源ID的路径加下划线和地图资源ID的名称。假设地图的资源ID为Library://Sample/Shanghai.MapDefinition,那么对应的文件基路径为“Sample_Shanghai”。如果是Session资源库,那么文件基路径等于Session ID加下划线、加地图资源ID的路径加下划线和地图资源ID的名称。假设地图资源ID为Session:70ea89fe-0000-1000-8000-005056c00008_en//Sample/Shanghai.MapDefinition

那么对应的BasePath为“70ea89fe-0000-1000-8000-005056c00008_Sample_Shanghai”。

1.2.2  基地图比例尺索引

基地图比例尺索引部分等于英文字符“S”加当前基地图的比例尺索引,例如“S0”。 那么,如何确定基地图的比例尺索引呢?当Viewer发送请求来查看某个比例尺的地图时,MapGuide会遍历基地图定义中FiniteDisplayScale元素的值,查找与当前请求的比例尺最为接近的第n个FiniteDisplayScale元素 (从0开始计数),n这个值就是当前请求对应的基地图比例尺索引。

给定如下的地图定义,假设Viewer发送请求查看比例尺为1:2830的地图,我们可以看到当前请求的比例尺与第6个FiniteDisplayScale元素的值2828.125最为接近,所以当前请求对应的基地图比例尺索引6。

 

<?xml version="1.0" encoding="UTF-8"?>

<MapDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="MapDefinition-1.0.0.xsd">

  <Name>New Map</Name>

  <CoordinateSystem>LOCAL_CS[&quot;Non-Earth (Meter)&quot;,LOCAL_DATUM[&quot;Local Datum&quot;,0],UNIT[&quot;Meter&quot;, 1],AXIS[&quot;X&quot;,EAST],AXIS[&quot;Y&quot;,NORTH]]</CoordinateSystem>

  <Extents>

    <MinX>1880999.75</MinX>

    <MaxX>1899000.25</MaxX>

    <MinY>458999.75</MinY>

    <MaxY>463000.25</MaxY>

  </Extents>

  <BackgroundColor>ffffffff</BackgroundColor>

  <Metadata>&lt;MapDescription&gt;Raster&lt;/MapDescription&gt;</Metadata>

  <BaseMapDefinition>

    <FiniteDisplayScale>0.690460205078125</FiniteDisplayScale>

    <FiniteDisplayScale>2.7618399999999999</FiniteDisplayScale>

    <FiniteDisplayScale>11.047359999999999</FiniteDisplayScale>

    <FiniteDisplayScale>44.189450000000001</FiniteDisplayScale>

    <FiniteDisplayScale>176.75781000000001</FiniteDisplayScale>

    <FiniteDisplayScale>707.03125</FiniteDisplayScale>

    <FiniteDisplayScale>2828.125</FiniteDisplayScale>

    <FiniteDisplayScale>11312.5</FiniteDisplayScale>

    <FiniteDisplayScale>45250</FiniteDisplayScale>

    <FiniteDisplayScale>181000</FiniteDisplayScale>

    <BaseMapLayerGroup>

      <Name>Raster</Name>

      <Visible>true</Visible>

      <ShowInLegend>true</ShowInLegend>

      <ExpandInLegend>true</ExpandInLegend>

      <LegendLabel></LegendLabel>

      <BaseMapLayer>

         <Name>g-07</Name>

         <ResourceId>Library://Layers/g-07.LayerDefinition</ResourceId>

         <Selectable>true</Selectable>

         <ShowInLegend>true</ShowInLegend>

         <LegendLabel>g-07</LegendLabel>

         <ExpandInLegend>true</ExpandInLegend>

 </BaseMapLayer>

    </BaseMapLayerGroup>

 </BaseMapDefinition>

</MapDefinition>

1.2.3  基层组

基层组部分等于基层组的名称。

1.2.4  行

行部分等于英文字符“S”加块所在的行组号。那么,如何确定一个块所在的行组呢?这取决于MapGuide服务器配置文件ServerConfig.ini中TileServiceProperties部分属性TileRowsPerFolder的值,将块的行号除以这个值然后取整,得到的值就是块所在的行组号。假设TileRowsPerFolder值为30,给定一个行号为50的块,那么它的行组号为1,行部分等于“R1”。

1.2.5  列

列部分等于英文字符“C”加块所在的列组。那么,如何确定一个块所在的列组呢?这取决于MapGuide服务器配置文件ServerConfig.ini中TileServiceProperties部分属性TileColumnsPerFolder的值,将块的列号除以这个值然后取整,得到的值就是块所在的列组号。假设TileColumnsPerFolder值为30,给定一个列号为50的块,那么它的列组号为1,列部分等于“C1”。

1.3  计算块的坐标

给定一个块的行号tileColumn和列号tileRow,块左下角坐标(tileMinX, tileMaxX)和右上角坐标(tileMinY, tileMaxY)的计算公式如下:

tileMinX = mapMinX + tileColumn * tileWidthMCS;

tileMaxX = mapMinX + (tileColumn+1) * tileWidthMCS;

tileMinY = mapMaxY - (tileRow +1) * tileHeightMCS;

tileMaxY = mapMaxY - tileRow * tileHeightMCS;

其中,mapMinX为块对应地图左下角的X坐标值,mapMaxY为右上角的Y坐标值,tileWidthMCS为的每个块的宽度,tileHeightMCS为每个块的高度,他们使用的单位是块所对应地图空间参考系的单位。tileWidthMCS和tileHeightMCS的计算公式如下:

tileWidthMCS = tileWidth * metersPerPixel * scale / metersPerUnit;

tileHeightMCS = tileHeight * metersPerPixel * scale / metersPerUnit;

其中,scale为块所对应的比例尺,tileWidth和tileHeight为块的像素宽度和高度;metersPerPixel 为像素与米的转换系数,MapGuide总是使用96 DPI,即96个像素等于一英寸;meterPerUnit为块所对应地图空间参考系单位与单位米的转换系数。

开源版MapGuide中的方法MgServerRenderingService::RenderTile(...)正好实现了计算一个块坐标值的逻辑,那么我们就以这个方法为例展示一下如何计算一个块的坐标值。

 

MgByteReader* MgServerRenderingService::RenderTile(MgMap* map,

                                                   CREFSTRING baseMapLayerGroupName,

                                                   INT32 tileColumn,

                                                   INT32 tileRow)

{

    ......

    // 获取地图的比例尺索引

    double scale = map->GetViewScale();

    INT32 scaleIndex = map->FindNearestFiniteDisplayScaleIndex(scale);

    ......

    // 按照layer group的名称获取layer group对象

    Ptr<MgLayerGroupCollection> layerGroups = map->GetLayerGroups();

    Ptr<MgLayerGroup> baseGroup = layerGroups->GetItem(baseMapLayerGroupName);

    ......

    // 根据比例尺索引获取对应比例尺的值

    scale = map->GetFiniteDisplayScaleAt(scaleIndex);

    // 确保当前地图使用了与Tile相同的DPI

    map->SetDisplayDpi(MgTileParameters::tileDPI);

    // 获取地图的范围,从而得到地图左上角和右下角的坐标值

    Ptr<MgEnvelope> mapExtent = map->GetMapExtent();

    Ptr<MgCoordinate> pt00 = mapExtent->GetLowerLeftCoordinate();

    Ptr<MgCoordinate> pt11 = mapExtent->GetUpperRightCoordinate();

    double mapMinX = rs_min(pt00->GetX(), pt11->GetX());

    double mapMaxX = rs_max(pt00->GetX(), pt11->GetX());

    double mapMinY = rs_min(pt00->GetY(), pt11->GetY());

    double mapMaxY = rs_max(pt00->GetY(), pt11->GetY());

// 获得Tile所对应地图空间参考系单位与单位米的转换系数

double metersPerUnit  = map->GetMetersPerUnit();

// 计算得到像素与单位米的转换系数

    double metersPerPixel = METERS_PER_INCH / MgTileParameters::tileDPI;

double tileWidthMCS   = (double)MgTileParameters::tileWidth  *

metersPerPixel * scale / metersPerUnit;

double tileHeightMCS  = (double)MgTileParameters::tileHeight *

metersPerPixel * scale / metersPerUnit;

// 计算得到Tile左下角和右上角的坐标

double tileMinX = mapMinX + (double)(tileColumn  ) * tileWidthMCS;

    double tileMaxX = mapMinX + (double)(tileColumn+1) * tileWidthMCS;

    double tileMinY = mapMaxY - (double)(tileRow   +1) * tileHeightMCS;

    double tileMaxY = mapMaxY - (double)(tileRow     ) * tileHeightMCS;

    ......

}

1.4  分块服务

分块服务是用来管理分块的一种服务,它提供了获取块和清除缓存块的功能。

1.4.1  设置分块服务

MapGuide服务器配置文件ServerConfig.ini中TilingServiceProperties部分用于配置分块服务,下表列出了所有可用的设置。

 

属性名称

描述

RenderOnly

用于设定是否只是渲染Tile,而不将Tile缓存到服务器上,0代表假,1代表真。

TileCachePath

用于指定Tile图像缓存的根目录。

TileColumnsPerFolder

用于指定每个Tile列组文件夹中包含的列数。

TileRowsPerFolder

用于指定每个Tile行组文件夹中包含的行数。

DefaultTileSizeX

用于指定Tile的像素宽度。

DefaultTileSizeY

用于指定Tile的像素高度。

ImageFormat

用于指定生成的Tile的格式,它的值可以为PNG、PNG8、GIF或JPG。

1.4.2  获取块

如下两个方法GetTile(…)用于为获取块,mapDefinition用于指定一个地图定义的资源ID,map用于指定一个地图实例,baseMapLayerGroupName用于指定地图中基层组的名称,tileColumn和tileRow分别用于指定块所在的行组号和列组号,scaleIndex用于指定块的比例尺索引。

MgByteReader GetTile(MgResourceIdentifier mapDefinition,

String baseMapLayerGroupName,

int tileColumn, int tileRow, int scaleIndex);

MgByteReader GetTile(MgMap map,

String baseMapLayerGroupName,

int tileColumn, int tileRow, int scaleIndex);

 

Sequence Diagram of Getting Tile

 

图6-3 获取块的时序图

 

在MapGuide服务器端,获取块的时序图如图6-3所示。当调用GetTile(…)方法时,分块服务会查看指定的块是否已经存在,如果存在,那么直接返回缓存的块;如果不存在,首先调用SE_Renderer渲染指定的块,然后将渲染结果保存为图像缓存在相应的文件夹,最后返回缓存的块。由此,我们知道MapGuide服务器并不是提前为基层地图生成块,而是按需生成块。如果你不在乎缓存块所占用的硬盘空间,那么可以编写一个小程序为每个块调用一遍GetTile(…)方法,让分块服务MapGuide提前为基层地图生成所有的缓存块,从而能够让客户端能够更加平滑地浏览地图。

1.4.3  获取块的大小

方法GetDefaultTileSizeX()和GetDefaultTileSizeY()用于返回块的宽度和高度,它们的单位都是像素。

int GetDefaultTileSizeX();

int GetDefaultTileSizeY();

1.4.4  清除缓存块

   方法ClearCache(…)用于清除属于指定基地图缓存在服务器上的所有块,你可以使用图3-3所示的MapGuide Web AP测试工具来调用此方法清除缓存块,手工删除指定地图在服务器上的对应缓冲文件夹也可以达到相同的效果。

void ClearCache(MgMap map);

块服务 Kratos布局 安装Kratos go get -u github.com/go-kratos/kratos/cmd/kratos/v2@latest 创建服务 # create a template project kratos new helloworld cd helloworld # Add a proto template kratos proto add api/helloworld/helloworld.proto # Generate the source code of service by proto file kratos proto server api/helloworld/helloworld.proto -t internal/service go generate ./... go build -o ./bin/ ./... ./bin/hellowor 立即下载

相关推荐

云计算平台存储服务(块服务安装操作)

实验任务: 一、安装Cinder组件 二、命令行CLI完成存储任务 1、创建一个10G的云磁盘并查看 2、 对Cinder后端逻辑进行扩容至50G 3、 指定Cinder卷类型 4、 创建并查看Cinder快照信息 三、 在Dashborad界面上完成块存储任务 1、创建一个10G的云磁盘并查看 2、 对Cinder后端逻辑进行扩容至50G 3、 指定Cinder卷类型 4、 创建并查看Cinder快照信息 一、安装Cinder组件 [root@controller ~]# 计算 验证 二、命令

Long_UP的博客 1605

VASP+Multiwfn+VMD静电势计算与可视化全流程解析

静电势是表征分子与材料表面电荷分布的关键物理量,它通过求解泊松方程,将电子密度与原子核电荷在空间中的贡献结合起来,直观揭示体系的电子富集与缺失区域。这一性质在理解化学反应活性、分子间相互作用(如氢键、卤键)以及材料表面性质方面具有重要价值。在计算材料科学与量子化学领域,基于第一性原理计算获得高精度电子结构数据后,如何将其转化为可直观分析的静电势图,是连接理论计算与物理解释的关键技术环节。本文聚焦于构建一条高效、可控的端到端工作流,详细解析如何利用VASP进行高精度电子密度计算,通过专业波函数分析软件Mult

weixin_33733810的博客 430

openstack云计算平台<9>--块存储服务(cinder)

目录概述一、安装并配置控制节点1.先决条件2.安装并配置组件3.配置计算节点以使用块设备存储4.完成安装二、安装并配置一个存储节点1.开启新的虚拟机做相应初始配置2.先决条件3.安全并配置组件4.完成安装三、验证操作四、图形化管理界面操作 概述 介绍: 块存储服务(cinder)为实例提供块存储。存储的分配和消耗是由块存储驱动器,或者多后端配置的驱动器决定的。还有很多驱动程序可用:NAS/SAN,NFS,ISCSI,Ceph等。 典型情况下,块服务API和调度器服务运行在控制节点上。取决于使用的驱动,卷服

小螺号的博客 1632

从XSA到Linux应用:Petalinux与Vitis的嵌入式开发全流程解析

本文详细解析了从XSA文件到Linux应用的嵌入式开发全流程,重点介绍了Petalinux与Vitis工具链的使用技巧和实战经验。通过XSA硬件描述、Petalinux工程搭建、系统镜像优化及Vitis开发配置等关键步骤,帮助开发者高效完成ZYNQ平台开发,解决常见问题并提升开发效率。

weixin_29195217的博客 192

【中英双语】Illumina测序原理详解 | 边合成边测序/Sequencing by Synthesis

很多朋友们问我视频讲解时用的笔记可不可以分享,那当然必须是可以呐!但我当时其实没有好好记录,只是打了个草稿就开讲啦!既然大家有需求,俺就重新整理了一下,希望可以帮到大家!

weixin_43843918的博客 7871

7、块存储服务(Block Storage service)

1、概述 块存储服务(cinder)为访客实例提供块存储设备。存储设置和消耗的方法由块存储驱动程序或多后端配置的驱动程序确定。有各种可用的驱动程序:NAS / SAN,NFS,iSCSI,Ceph等。 Block Storage API和调度程序服务通常在控制器节点上运行。根据使用的驱动程序,卷服务可以在控制器节点,计算节点或独立存储节点上运行。 OpenStack Bloc...

diankupi3880的博客 1322

EG800K 4G模块AT指令避坑指南:让你的STM32物联网项目稳定连接云端

本文详细解析了EG800K 4G模块在STM32物联网项目中的AT指令应用避坑指南,涵盖从底层协议到云端稳定的全链路优化策略。通过实战案例和防护机制,帮助开发者解决常见通信陷阱,提升云端通信的稳定性和效率。

weixin_26834815的博客 288

java文件分块上传,OkHttp文件上传(2):实现文件分块上传

前言分块上传和断点下载很像,就是讲文件分为多份来传输,从而实现暂停和继续传输。区别是断点下载的进度保存在客户端,ey往是写入数据库,分块上传的进度保存在服务器,每次可以通过文件的md5请求服务器,来获取最新的上传偏移量。但是这样明显效率偏低,客户端可以把offSet保存在内存,每上传一块文件服务器返回下一次的offSet。只不过这个offSet不需要保存在数据库,每次app关闭在打开继续上传可以请...

weixin_35323111的博客 1247

lisflood-fp(一)从源码到可执行文件:Windows下的Cmake实战编译指南

本文详细介绍了在Windows环境下使用Cmake工具编译lisflood-fp水文模型源码生成可执行文件的全过程。从开发环境配置、源码获取到实战编译,逐步指导如何解决常见错误并处理运行时依赖,最终生成可用的exe文件。特别适合水文专业研究者和工程师学习参考。

weixin_30555125的博客 481

YOLOv11改进 | 上采样篇 | YOLOv11引入DySample轻量级动态上采样器

虽然最近的基于内核的动态上采样器(如CARAFE、FADE和SAPA)的性能提升令人印象深刻,但它们引入了大量工作负载,主要是由于耗时的动态卷积和用于生成动态内核的额外子网。DySample模块的设计旨在解决现有动态上采样器的高计算开销和复杂性问题,同时提供更好的性能和效率。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

tsg6698的博客 3126

15.6 传输编码和分块编码

前一节讨论的内容编码,是对报文的主体进行的可逆变换。内容编码是和内容的具体格式细节紧密相关的。例如,你可能会用 gzip 压缩文本文件,但不是 JPEG 文件,因为 JPEG 这类东西用 gzip 压缩的不够好。 本节讨论传输编码。传输编码也是作用在实体主体上的可逆变换,但使用它们是由于架构方面的原因,同内容的格式无关。使用传输编码是为了改变报文中的数据在网络上传输的方式。 1. 可靠传输 长久以来

用不完的好奇心 768

【AI测试必学】DeepSeek API 快速入门:获取 API Key 与调用 API 步骤详解

DeepSeek API 使用与 OpenAI 兼容的格式,可以通过修改配置使用 OpenAI SDK。生成的 API Key 只会显示一次,请妥善保存。注册并登录账号,进入左侧导航栏的。创建 API Key。

blues_C的博客 1万+

Boost.Beast HTTP分块传输编码实战:从原理到流式服务器构建

HTTP分块传输编码是HTTP/1.1协议中的一项核心特性,它允许服务器在未知响应体总大小的情况下,将数据分割成一系列带有大小信息的“块”进行流式传输。其工作原理是通过在响应头设置`Transfer-Encoding: chunked`,并在数据体中使用十六进制块大小与CRLF分隔符来组织数据流,最后以零长度块标记结束。这项技术的核心价值在于支持动态内容生成、实时数据推送和大文件处理等场景,有效突破了传统`Content-Length`头部对数据长度必须预先可知的限制。在C++网络编程中,Boost.Bea

weixin_30911451的博客 445

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jquery上传 java,使用JAVA中的jquery文件上传插件分块上传文件

Trying to use blueimp JQuery file upload plugin to upload large files( greater than 1 GB). Found using the maxChunkSize configuration allows to do the file upload in chunks from client side. Server we...

weixin_36182568的博客 121

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C/C++网络编程--文件分块传输

文件分块传输是网络编程中一个常见的任务,尤其是在处理大文件时,将文件分块可以提高传输效率,简化错误处理,并可以实现并发传输。下面,写个从客户端向服务器发送大型数据的demo。

m0_46410698的博客 1575

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

HTTP要点概述:七,编码,压缩传输,分块传输

一,编码: HTTP 在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量的访问请求。但是,编码的操作需要计算机来完成,因此会消耗更多的 CPU 等资源。

yangzigege的博客 508

HTTP协议:分块编码Trunked

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33989058的博客 640

android 上传文件到 c 服务器,android - 将大文件上传到服务器android - 堆栈内存溢出...

我试图将大文件上传到服务器(支持的最大文件大小为128Mb)。 如果我正确理解,则服务器可以接收大文件(例如500Mb),但前提是这些文件以块发送。 我写了下面的方法,希望它可以将视频文件分块上传到服务器。 但是,我从服务器收到以下错误:413请求实体太大波纹管是我的方法:public static void uploadFile(Context context, Uri videoUri,...

weixin_32629285的博客 199

基于Windows平台远程桌面 - 分块异或屏传算法的设计与实现

本文介绍一下基于Windows GDI的远程桌面传输。远程桌面方法其实很简单,无外乎GDI截屏->socket传输->GDI画图这三大步骤,但实际上比较麻烦,最难解决的就是截屏后图像太大的问题,以1920*1200像素的屏幕分辨率为例,截屏一张24位的bmp位图,大约需要8M左右字节,连续截图产生的数据量会给socket带来巨大的压力。也有人说可以在GDI截屏之后直接将数据压缩为jpg图像再传输,实践发现存在两个问题:1、压缩后一张图片的大小约为200K-300K,连续截屏的情况下,socket

yiyefangzhou24的专栏 2112

AES加密结合分块上传:Java大文件安全传输与断点续传实践

文件上传是后端开发中的高频需求,而大文件上传常伴随着内存压力、网络中断、进度难以追踪等工程难题。同时,对于医疗影像、财务单据等敏感数据,仅依赖HTTPS传输并不足够,业务层还需对数据本身进行加密,确保明文只在可信环境中出现。AES作为对称加密算法,具有极高的加解密吞吐量,适合大体积数据;分块上传则通过将文件切分为独立小块,实现断点续传和并发控制。将二者结合的关键在于加密粒度与分块边界的对齐:每一块使用独立的IV进行AES-GCM加密,并携带认证标签,服务端只保存密文,待全部接收后再统一解密合并。这种方案不仅

weixin_29290259的博客 261

FastAPI分块上传断点续传:Content-Range终极指南 [特殊字符]

FastAPI框架为现代Web开发提供了高性能、易学易用的解决方案,特别在处理大文件上传和流式数据传输方面表现出色。本文将深入探讨如何利用FastAPI实现高效的分块上传和断点续传功能,帮助开发者轻松处理大文件传输挑战。 ## 为什么需要分块上传和断点续传? 🤔 在传统文件上传中,当用户上传大文件时,如果网络中断或服务器出现问题,整个上传过程需要重新开始。这不仅浪费带宽和时间,还可能导致用户

gitblog_00947的博客 911

ajax实现文件分块上传,使用HTML5 FormData对象实现大文件分块上传(断点上传)功能...

FormData是HTML5新增的一个对象,通过FormData对象可以组装一组用submit()方法传输的数据格式相同。具体用法参考 FormData对象的使用。实现逻辑:客户端首先请求接口,获取一个唯一的UploadID,然后每次按照固定大小读取文件块,同时计算需要上传的总块数total,将UploadID、total、当前上传文件块的下标index、文件名称以及文件块上传到服务端,服务端...

weixin_36149595的博客 407

php+js实现文件分块上传

我们在上传大文件时,可能会由于服务器的原因导致文件上传失败,文件过大时由于服务器的配置或响应事件过长导致上传文件失败,这时候我们可以将一个大的文件分为若干块,然后分批次上传到服务端,当所有文件块上传完成后再由服务器将各个文件块整合成我们上传的文件 一:分块上传流程: 1:由前端js将上传的文件信息进行切割成若干块,然后循环将若干块的文件块上传到服务端 2:服务端接收到文件块信息后保存起来,当所有文件块上传完毕后,将所有上传的文件块整合成文件并保存起来 二:实现代码: 1:HTML <in

huaweichenai的博客 459
上一篇: MapGuide API
下一篇: 站点和站点服务
MapGuide_Inside
博客等级 码龄17年 340粉丝 71原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值