如何上传二进制上传数据

在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
最近突然对这个问题产生了困惑,我知道http是超文本传输协议,它传输过程和传输结果都是文本文件么?但它又可以传输二进制文件(如上传下载图片),所以http传输的格式到底是什么?用搜索引擎和看书都没有发现确切的答案,望解答
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
http是基于tcp的一种上层实现
1:底层一定是二进制的,网线和光缆都只能传输脉冲二进制啊
2:按照官方资料,http传输的是超级文本(所有WWW文件/网络资源在这里应该都是属于超级文本了),而这些文件本身就是二进制,一个img图片、一个Js文件、一个mp3文件都是二进制形式存在的啊,只不过通过编辑器看到的“文本”是把这个二进制解释成高级“文本”来展现罢了,就算用记事本打开一张图片,依然可以看到一堆文本啊,这不过图片的二进制和记事本(编辑器)的解释器不匹配,所以看起来是乱码;但是这些都是抽象出来的,并不是说我们在浏览器看到的res就是http收到的数据,只能说这是经过浏览器处理解析后的可视化数据,本质上通过http传输的,或者说通过tcp,或者说通过光缆/无线电波传输的信息都是二进制的形式,具体在哪一层如何界定,这个真不容易量化和界定。
所以:此文本非彼“文本”,超文本是啥,就是二进制文件在http协议中的存在形式,或者叫编码更合适。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你可以查一下MIME。就我自己理解,http/0.9是不支持非文本的,1.0之后才支持的,因为其增加了MIME。http/1.0之后版本在传输非文本文件的时候,比如图片,其实是使用MIME转换成ASCII传输的
所以说,我认为是是文本
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
小富即安, 积分 2673, 距离下一级还需 2327 积分
论坛徽章:2
我有一个4G的二进制文件,现在要在256的偏移处,再插入10个字节,也就是不能覆盖后面的内容。
我觉得类似于数据库中的可变长字段,如Varchar,一开始字段存了100个字节,如果编辑了内容变为200个字节,类似这种情况。
C有没有插入这样的操作文件函数?还是要自己将后面(4G-256)字节往后移?自己移是不是要个临时文件呀,这样颠倒也太慢了吧?
问下各位老鸟,有没有效率更高,更好的办法?望各位不吝赐教。
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
巨富豪门, 积分 22891, 距离下一级还需 17109 积分
论坛徽章:35
先往后面写10个,再把大段往后挪10,再写10。也没多麻烦啊,挪的buf用4k吧。
巨富豪门, 积分 22891, 距离下一级还需 17109 积分
论坛徽章:35
中国队4:3澳大利亚,那几个进球还算不错啊
丰衣足食, 积分 776, 距离下一级还需 224 积分
论坛徽章:0
这跟c语言没有关系,跟平台的可执行文件格式有关。
据我所知256偏移的地方还是文件头的部分,你为什么要在这插入10个字节,你要实现什么功能?
另外,程序的代码段和数据段一般是要按区块对齐的,不足区块长度的时候填充0,这就有冗余数据了,你可以选择在这些冗余的地方填入你的补丁而不影响源程序
丰衣足食, 积分 776, 距离下一级还需 224 积分
论坛徽章:0
cokeboL 发表于
先往后面写10个,再把大段往后挪10,再写10。也没多麻烦啊,挪的buf用4k吧。
二级制程序里是有地址的,你把数据移动了,那些相对地址就找不到原来的数据了。
巨富豪门, 积分 22891, 距离下一级还需 17109 积分
论坛徽章:35
4G的文件,应该不是程序吧。不是程序的有地址的影响没?
哎,可惜小日本赢了南棒子啊,否则中国队就积分第一了
丰衣足食, 积分 776, 距离下一级还需 224 积分
论坛徽章:0
cokeboL 发表于
回复 5# sqfasd
哦,理解错了,呵呵,往复杂的想去了
巨富豪门, 积分 26507, 距离下一级还需 13493 积分
论坛徽章:13
本帖最后由 yulihua49 于
10:55 编辑
leiing 发表于
我有一个4G的二进制文件,现在要在256的偏移处,再插入10个字节,也就是不能覆盖后面的内容。
我觉得类似 ...
不是什么C不C的问题。
这本身是数据库的活,你非要在文件上做,没好办法,一点点挪,或重新拷贝一个。
你参考一下ORACLE的做法,一开始,每个数据块都不用满,后边留一个溢出区,本块内哪个字段多出来了,使用溢出区。溢出区不够了,把这个记录移到文件尾,在原来的位置做一个标记,指示到新位置读。这一系列操作对用户透明。
小富即安, 积分 2673, 距离下一级还需 2327 积分
论坛徽章:2
多谢各位的回答。
我的4G文件是数据,不是什么可执行文件。
文件的内容是多个类似于记录的小块组成的,有个长度表示本条记录的长度,就类似于数据库中的varchar。
现在要修改其中一条记录(长度),才发现有这个问题。
多谢8楼的yulihua49提供了些有用信息。如果没有好的办法,我就改数据库存算了。
巨富豪门, 积分 29573, 距离下一级还需 10427 积分
论坛徽章:4
这种东西最好用数据库存,自己写也可以。用这样的办法:
你的记录有没有顺序?如果没有顺序,每个字段加一个废弃号,前面留四个字节存储废弃的字段数目和总数,超过百分之多少就重新组织一次文件。然后要修改就添加新的记录,然后废弃掉以前旧的(或者旧的留一个特殊大小,比如说-1,然后后面跟文件偏移,这样可以保证有顺序。
其次,你可以在文件末尾(注意是末尾)或者是新建一个文件,存储一个映射表,记录映射到文件位置,然后同样这样处理。
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处拒绝访问 | www. | 百度云加速
请打开cookies.
此网站 (www.) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3b8f5dbeb6024370-ua98).
重新安装浏览器,或使用别的浏览器 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
在http协议中传输二进制的数据--base64实现
下载积分:30
内容提示:在http协议中传输二进制的数据--base64实现
文档格式:PDF|
浏览次数:178|
上传日期: 23:00:03|
文档星级:
全文阅读已结束,如果下载本文需要使用
 30 积分
下载此文档
该用户还上传了这些文档
在http协议中传输二进制的数据--base64实现
关注微信公众号> 博客详情
最近做一个上传图片接口,之前是把图片二进制流转成&base64 字符串上传,这样传输量会比直接传二进制大不少。所以就想着直接传二进制流。
网上有很多方法,但自己能走通的就只有两种,一种是直接获取 request 中的IO流,从里面取二进制流就行。但如果传多个文件时,上传与接收端要区分文件很麻烦。
另外一种就比较方便(使用MultipartHttpServletRequest):
& & & & MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)
& & & & Map&String, MultipartFile& fileMap = multipartRequest.getFileMap();
& & & & for (Map.Entry&String, MultipartFile& entity : fileMap.entrySet()) {
& & & & & & MultipartFile mf = entity.getValue();
& & & & & & byte[] byteArray = mf.getBytes(); // 二进制流
& & & & & & String realName = mf.getOriginalFilename(); // 文件名
& & & & & & String fileExt = realName.substring(realName.lastIndexOf(".") + 1);
& & & & & & String name = realName.substring(0, realName.indexOf(fileExt) - 1 );
&&&&&&&&& & // ......
由于默认情况下 request 是&HttpServletRequest 类型而不是&MultipartHttpServletRequest ,因此直接强转会报错。还要配置一下 xml 将&HttpServletRequest 转成&MultipartHttpServletRequest 类型:
&!-- make sure: MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) --&
&bean id="multipartResolver"
class="org.springframework.monsMultipartResolver"&
&property name="defaultEncoding" value="UTF-8"&&/property&
&property name="maxUploadSize" value=""&&/property&
&property name="maxInMemorySize" value="4096"&&/property&
想了解原理,可以看看
org.springframework.web.servlet.DispatcherServlet
里的代码: private MultipartResolver multipartR // 就是由这个接口把&HttpServletRequest 转成其它类型的
而 xml 中引用的&CommonsMultipartResolver 实现了&MultipartResolver 接口。因此可以知道是由
CommonsMultipartResolver &把普通的&HttpServletRequest &转成了&MultipartHttpServletRequest。
postman 则要使用 form-data模式上传图片:
注意文件必须前面给一个字段名,如图: image
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥}

我要回帖

更多关于 http 上传二进制数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信