linux 传输文件stpf,在Linux下搭建 miniGUI mStudio环境...-linux 全面剖析ps命令-纯Servlet实现文件上传_169IT.COM...
项目需求,需要在板子上写一个mini的web项目,由于空间的有限(大概4M)并且项目中有文件上传的功能,所以就选择用servlet实现.
大体步骤就是: 解析request头信息 获取数据流 输入到指定目录 , 但实现的功能有个很严重的缺陷,就是全部将数据流读出来,没有缓存.
导致服务器内存爆满,没有办法读取大的数据流,所以也就放弃了用这种方法实现.具体的方法如下,如有更好的办法,请大家指点一下.
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.meeboss.meestorage.bean.MeeFile;
/**
* 文件操作副助类
*
*/
public class FileUtil {
/**
* 上传文件到指定目录 并返回文件信息(文件名,大小)
*
* @param request
* @return
*/
public static MeeFile uploadFileToDest1(HttpServletRequest request,
String dest) {
final int NONE = 0;
final int DATAHEADER = 1;
final int FILEDATA = 2;
final int FIELDDATA = 3;
// 将请求消息的实体送到b变量中
int TotalBytes = request.getContentLength();
byte[] b = new byte[TotalBytes];
String contentType = request.getContentType();// 请求消息类型
String filename = ""; // 文件名
String boundary = ""; // 分界符
String lastboundary = ""; // 结束符
int filesize = 0; // 文件长度
int pos = contentType.indexOf("boundary=");
if (pos != -1) {// 取得分界符和结束符
pos += "boundary=".length();
boundary = "--" + contentType.substring(pos);
lastboundary = boundary + "--";
}
int state = NONE;
// 得到数据输入流reqbuf
try {
DataInputStream in = new DataInputStream(request.getInputStream());
in.readFully(b);
in.close();
String reqContent = new String(b, "UTF-8");
BufferedReader reqbuf = new BufferedReader(new StringReader(
reqContent));
boolean flag = true;
while (flag == true) {
String s = reqbuf.readLine();
if ((s == lastboundary) || (s == null))
break;
switch (state) {
case NONE:
if (s.startsWith(boundary)) {
state = DATAHEADER;
}
break;
case DATAHEADER:
pos = s.indexOf("filename=");
if (pos == -1) {// 将表单域的名字解析出来
pos = s.indexOf("name=");
pos += "name=".length() + 1;
s = s.substring(pos);
int l = s.length();
s = s.substring(0, l - 1);
state = FIELDDATA;
} else {// 将文件名解析出来
String temp = s;
pos = s.indexOf("filename=");
pos += "filename=".length() + 1;
s = s.substring(pos);
int l = s.length();
s = s.substring(0, l - 1);
pos = s.lastIndexOf("\\");
s = s.substring(pos + 1);
filename = s;
// 从字节数组中取出文件数组
pos = byteIndexOf(b, temp, 0);
b = subBytes(b, pos + temp.getBytes().length + 2,
b.length);// 去掉前面的部分
s = reqbuf.readLine();
b = subBytes(b, s.getBytes().length + 4, b.length);
pos = byteIndexOf(b, boundary, 0);
b = subBytes(b, 0, pos - 1);
File f = new File(dest, filename); // 写入文件
DataOutputStream fileout = new DataOutputStream(
new FileOutputStream(f));
fileout.write(b, 0, b.length - 1);
filesize = b.length - 1;
state = FILEDATA;
}
break;
case FIELDDATA:
s = reqbuf.readLine();
state = NONE;
break;
case FILEDATA:
while ((!s.startsWith(boundary))
&& (!s.startsWith(lastboundary))) {
s = reqbuf.readLine();
if (s.startsWith(boundary)) {
state = DATAHEADER;
break;
}
}
break;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 指定输出类型
MeeFile meeFile = new MeeFile();
meeFile.setName(filename);
meeFile.setLength(String.valueOf(filesize));
return meeFile;
}
/**
* 字节数组中的INDEXOF函数,与STRING类中的INDEXOF类似
*
* @param b
* @param s
* @param start
* @return
*/
private static int byteIndexOf(byte[] b, String s, int start) {
return byteIndexOf(b, s.getBytes(), start);
}
/**
* 字节数组中的INDEXOF函数,与STRING类中的INDEXOF类似
*
* @param b
* @param s
* @param start
* @return
*/
private static int byteIndexOf(byte[] b, byte[] s, int start) {
int i;
if (s.length == 0) {
return 0;
linux 传输文件stpf,在Linux下搭建 miniGUI mStudio环境...-linux 全面剖析ps命令-纯Servlet实现文件上传_169IT.COM...相关推荐
- 在Linux下搭建 miniGUI mStudio环境
嵌入式环境搭建准备工作 Linux操作系统:ubuntu 8.04 准备好mStudio 安装文件和运行mStudio的第三方软件 在Eclipse官方网站http://www.eclipse.org ...
- Linux 下搭建 Scala 开发环境
在实际开发中,我们的项目是部署到 linux,因此,我们需要在 Linux 下搭建 scala 的环境. 具体的步骤如下: 下载对应的 scala 的安装软件.scala-2.11.8.tgz 通过远 ...
- linux下搭建python机器学习环境
前言 在 linux 下搭建 python 机器学习环境还是比较容易的,考虑到包依赖的问题,最好建立一个虚拟环境作为机器学习工作环境,在建立的虚拟环境中,再安装各种需要的包,主要有以下6个(这是看这个 ...
- Ubuntu下搭建MPI并行计算环境
Ubuntu下搭建MPI并行计算环境 [日期:2012-10-10] 来源:Linux社区 作者:hs794502825 [字体:大 中 小] 在这里面可以选择一个合适的openmpi安装包,此处我选 ...
- Windows下搭建ESP-IDF开发环境,适合ESP32/S2/C3/S3系列模组二次开发
前言 本教程适用于以下两种用户: ①无Linux环境搭建经验或搭建Linux开发环境不成功: ②使用安信可windows一体化环境IDE V1.5开发环境搭建不成功: 本教程提供了windows下搭建 ...
- ubuntu下搭建android开发环境(转载)
在ubuntu下搭建android开发环境,准备学习一下android开发. 1.安装JDK 首先到oracle的官网上下载linux版本的JDK(网址为:http://www.orac ...
- Windows10 下搭建汇编语言开发环境( 利用 DOSBOX 和 MASM32 )
Windows10下搭建汇编语言开发环境(利用DOSBOX和MASM32):https://www.cnblogs.com/zyever/p/7919007.html 如何在win10 64位下搭载汇 ...
- iis7 mysql_windows 7 下搭建php开发环境(windows7+IIS7+php+mysql)
首先需要说明的是,基于IIS v6.0/v7.0(2008),可以支持的脚本相当完整,不仅支持Linux无法支持的asp/asp.net,还可以安装php.mysql.zend实现php环境.同时,利 ...
- 乐鑫Esp32学习之旅② 巧用eclipes编辑器,官方教程在Windows下搭建esp32开发环境,打印 “Hello World”。
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...
最新文章
- 智办事:高效的目标管理,让企业战略目标得以实现
- 算法-链表-给定一个数小于该值的在左边等于在中间大于的在右边
- 以太坊白皮书_区块链60讲第33集~什么是以太坊?
- 一场开源数据库的精酿啤酒节,会有多少种味道?
- plsql如何连接oracle11g_64位win7 plsql连不上oracle11gr2 64位—plsql连接配置
- rank() over,dense_rank(),row_number() 的区别
- Windows 下,使用 Pycharm + Anaconda(NumPy,SciPy 等集成包)的环境配置
- oracle 使从表中随机取出一行记录数据
- 分块查询 缓解内存开销
- 使用System Center Operations Manager监视Exchange 2007客户端连通性(二)
- map容器中删除一个元素(value)
- 《西线无战事》:合上书的那一刻:只想痛哭
- 微信支付将推双面屏;库克谈收购英特尔基带业务;Chrome 76 稳定版发布 | 极客头条...
- 手机能打开的表白代码_不是程序员都能学会的5个表白代码,一学就会,附源码...
- 英语听力学习方法,转自一牛人的博客
- 2016西安教师职称计算机考试,2016年教师职称计算机考试题库.doc
- Verilog 层次化文件设计——彩灯控制器
- 恒生UFX交易接口基本介绍
- puppeteer学习(三)——抓取“相关搜索”关键词搜索豆瓣图书榜
- G.1用python进行精细中文分句(基于正则表达式),HarvestText:文本挖掘和预处理工具
热门文章
- 惠民计算机学校,惠民县职业中等专业学校
- 你眼中的罗振宇和罗辑思维?
- 制作Android开机动画 bootanimation.zip
- 扬州大学广陵学院计算机科学与技术女生多吗,超激动!萌新们纷纷晒出与扬大录取通知书合照...
- C语言 统计一篇英文短文中单词的个数
- 【会议征稿|SPIE独立出版|往届已检索】第二届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2022)
- 成都Java开发已经饱和了?
- 三面阿里,有惊无险成功拿到offer定级P7,只能说是真的难
- MATLAB的figure文件保存成高清图片的技巧01
- 交互设计师需要从什么做起?