上传文件

开始想用apache的开源库获取文件,但是失败了,要么文件不全,要么就完全为空,还是自己写。

文件上传请求头的部分内容

contentType:multipart/form-data; boundary=----WebKitFormBoundaryHpUAY0qCryu0Oc7o

我们需要获取boundary 后面的数据,主要作用是标识文件在流中的范围。当然了,这个boundary是会变的,每次都要重新获取。

请求头之后就是发送的数据(以一个文件为例)

第一行

------WebKitFormBoundaryHpUAY0qCryu0Oc7o

第二行

Content-Disposition: form-data; name="file"; filename="ic_excel.xml" filename:ic_excel.xml

第三行

Content-Type: text/xml

第四行

\r\n\

倒数第四行\

\r\n

倒数第三行

------WebKitFormBoundaryHpUAY0qCryu0Oc7o

倒数第二行

ic_excel.xml\

倒数第一行\

------WebKitFormBoundaryHpUAY0qCryu0Oc7o--

也就是说我们需要按照行的方式来读取,以免错过这些boundary,又不能够使用Java提供的readLine,在二进制文件几乎没有换行,我们的字节数组是盛不下一行的。

private LineData getLineData(InputStream inputStream, int capacity) {

byte[] bytes = new byte[capacity];

int index = 0;

try {

while (true) {

int current = inputStream.read();

if (current == '\r') {

//检查下一个是否是\n

int next = inputStream.read();

bytes[index++] = (byte) current;

bytes[index++] = (byte) next;

if (next == '\n') {

//是\n,是一个crlf换行,退出循环

break;

} else if (next == -1) {

//因为是-1,所以退出while 不会添加换行,基本不会出现这种情况,可以根据自己需要抛出异常

index--;

break;

} //current 是正常的一个\r

} else if (current == -1) {//因为是-1,所以退出while 不会添加换行,基本不会出现这种情况,可以根据自己需要抛出异常

break;

} else

bytes[index++] = (byte) current;

if (index >= capacity - 1) {//不够下一次的\r\n了

break;

}

}

return new LineData(bytes, index);

} catch (IOException e) {

e.printStackTrace();

return null;

}

}

static class LineData {

byte[] bytes;

String string;

int length;

LineData(byte[] bytes, int length) {

this.bytes = bytes;

this.string = new String(bytes, 0, length);

this.length = length;

}

}

最后一个boundary(倒数第三行)的上面是一个换行(还要注意哦,所有的换行都是\r\n),所以在我们不知道下一行是不是boundary时,是不可以贸然写入文件的。

LineData lastLine = null;

while (true) {

LineData temp = getLineData(inputStream, capacity);

if (temp == null) {//出现异常

break;

}

if (temp.string.contains(first)) {

//上一行(lastLine)是crlf,这样就没有输出这个内容就退出了

break;

}

if (lastLine != null) {

bufferedOutputStream.write(lastLine.bytes, 0, lastLine.length);

}

lastLine = temp;

}

文件读取完毕之后还要检查后面的boundary,如果后面的内容不是我们预期的那样,这个文件基本就是错误的了。解决办法将这几行数据作为文件内容,继续读取,知道下一组boundary结束组合。

还可以根据文件类型,设定字节数组,比如文本文件,每行一百的都是足够的,如果是二进制文件,需要使用更长的数组。

android服务器怎么做的,[Android]Android 制作一个HTTP服务器应用相关推荐

  1. 服务器如何做中转进行端口映射,使服务器之间通信,然后访问目标网站(baidu.com)

    文章目录 服务器如何做中转进行端口映射,使服务器之间通信,然后访问目标网站(baidu.com) 问题缘由 所需环境 操作步骤 1. 目的服务器设置 2. 中间服务器设置 3. 修改客户端 总结 服务 ...

  2. 【Android Studio学习】第一篇、制作一个拥有登录和注册功能的简易APP

    目录 第一部分.前言 1.目标效果 2.准备知识 第二部分.详细步骤 1.新建Empty工程 ​2.添加资源文件 3.搭建注册界面 4.搭建登录界面 5.编写注册界面和登录界面的代码 6.设置APP初 ...

  3. android countdowntimer 格式化,Android中使用CountDownTimer封装CountDownUtil,制作一个简易定时器...

    // CountDownUtil import android.os.CountDownTimer; public class CountDownUtil { /** * 倒计时结束的回调接口 */ ...

  4. android 心形上漂动画,PowerPoint Viewer制作一个漂亮心形飞出动画的操作教程

    各位使用PowerPoint Viewer的同学们,你们知道怎么制作一个漂亮心形飞出动画吗?在这篇教程内小编就为各位呈现了PowerPoint Viewer制作一个漂亮心形飞出动画的操作教程. Pow ...

  5. 服务器怎么做无盘系统,如何用云服务器做无盘系统

    如何用云服务器做无盘系统 内容精选 换一换 如果创建私有镜像所使用的原云服务器挂载了多个数据盘,可能导致由私有镜像创建的新云服务器无法使用.因此在创建私有镜像前,需要卸载原云服务器中挂载的所有数据盘. ...

  6. 亚马逊服务器怎么做系统,使用亚马逊云服务器EC2做深度学习(四)配置好的系统镜像...

    这是<使用亚马逊云服务器EC2做深度学习>系列的第四篇文章. 配置深度学习的环境是一个非常繁琐的过程.它要求你对Linux命令有一定地了解,与此同时各种深度学习库.驱动更新十分频繁,有可能 ...

  7. ai怎么做盒子效果图_AI制作一个漂亮的3D立体质感标志

    这篇教程教脚本之家的朋友们用AI制作一个漂亮的3D立体质感标志方法,教程绘制的效果图很漂亮绘制的难度中等,教程中同时还是用PS做了简单的处理.转发过来和脚本之家的AI爱好者们一起学习这个标志的绘制.希 ...

  8. php开发ftp服务器搭建教程,在Linux中搭建一个FTP服务器

    在Linux中搭建一个ftp服务器,以供两个工作小组保管文件使用.禁用匿名.第一个小组使用ftp账号:ftp1,工作目录在:/var/ftp/ftp1:第二个小组使用ftp2,工作目录在:/var/f ...

  9. java服务器和linux_在Linux下开一个Java服务器(使用CatServer Pro)

    引言 Linux开服具有快速,高效,性能等特点,而Windows虽然简单,但是不具备Linux良好的性能. 本教程就说明一下简单的Linux开服方式(@需要教程的人,如果你学会后,请无偿帮助更多的人. ...

  10. RED5流媒体服务器作为客户端转发流至另一个RED5服务器

    RED5流媒体服务器,是Java开源的实现RTMP协议的服务器.有关RTMP协议,网上有很多的介绍.现在着重介绍一下,客户端连接RED5服务器的开发流程. RED5有一个client包red-clie ...

最新文章

  1. P5568 [SDOI2008]校门外的区间(离散数学应用+线段树+开闭区间处理)(校门三部曲)难度⭐⭐⭐⭐
  2. chapter13 机器学习之利用PCA简化数据
  3. JQuery绑定事件 时如何传递参数
  4. 均值极差图控制上下限_年度质量回顾-单值移动极差
  5. 斐波那契java编写_请编写一个Java程序的斐波那契数
  6. Windows平台下搭建Git服务器的图文教程
  7. 2008-2019年高等学校科技统计资料汇编
  8. 关于Linux下MySQL主备集群负载均衡之读写分离(MaxScale)的一些笔记
  9. 声音存储空间计算公式_声音文件存储量的计算公式
  10. 【音乐】后弦 - 笔墨侍候
  11. Zookeeper隐藏通道和羊群效应
  12. 快递100显示查询错误?快递100快递查询类FAQ
  13. 小白学语句:省市区选择(带全国省市区数据)
  14. Nature:16年前的论文生成软件SCIgen至今仍有人用,骗过同行评审,论文被接收...
  15. Fastadmin 阿里云Oss插件的配置
  16. UI必备 PS圆角Corner Editor插件
  17. Linux服务 httpd
  18. Fragment has not been attached yet 解决方法及源码详解
  19. docker异常--docker bind: cannot assign requested address.
  20. application.yml 要有如下图图标,否则启动有问题

热门文章

  1. (转载)ubuntu开启SSH服务
  2. Mysql数据库的几大优势
  3. String ... String 三个点 jdk1.5的特性.才知道
  4. GPLT2017题目
  5. 图论中的基础概念总结
  6. 西北民族大学c语言程序设计复试科目,2016年西北民族大学中国民族信息技术研究院962C语言程序设计复试笔试仿真模拟题...
  7. ihtml2document能不能根据id获取dom_一段监视 DOM 的神奇代码
  8. java 4个系统,JSP系统的四个组成部分
  9. redis实现轮询算法_【07期】Redis中是如何实现分布式锁的?
  10. 1555C. Coin Rows