浅谈图片上传利用request.getInputStream()获取文件流时遇到的问题
作者:晴朗依旧 发布时间:2023-10-18 10:36:43
标签:图片上传,request.getInputStream,文件流
图片上传功能是我们web里面经常用到的,获得的方式也有很多种,这里我用的是request.getInputStream()获取文件流的方式。想要获取文件流有两种方式,附上代码
int length = request.getContentLength();//获取请求参数长度。
byte[] bytes = new byte[length];//定义数组,长度为请求参数的长度
DataInputStream dis = new DataInputStream(request.getInputStream);//获取请求内容,转成数据输入流
int readcount = 0;//定义输入流读取数
while(readcount < length){
int aa= dis.read(bytes,readcount,length); //读取输入流,放入bytes数组,返回每次读取的数量
readcount = aa + readcount; //下一次的读取开始从readcount开始
}
//读完之后bytes就是输入流的字节数组,将其转为字符串就能看到
String bb = new String(bytes,"UTF-8");
上面这种是利用读取输入流的方式,也可以用写入字节输入流的方式获取,就不需要获取请求长度了
DataInputStream dis = new DataInputStream(request.getInputStream());
ByteArrayOutputStream baot = new ByteArrayOutputStream();
byte[] bytes = new byte[1024]; //定义一个数组 用来读取
int n = 0;//每次读取输入流的量
while((n=dis.read(bytes))!=-1){
baot.write(bytes); //将读取的字节流写入字节输出流
}
byte[] outbyte = boat.toByteArray();//将字节输出流转为自己数组。
String bb = new String(outbyte,"UTF-8");
这两种方式都能获取传输的内容,但有两点一定要注意一下,最开始在获取的时候只能获取到文件的名字却没有文件的内容,这里附上测试用的前端代码:
上网查了一下,有的人是input标签里面没有name属性会导致这个问题,但是我并不是没有name标签。继续查是这样的:
所以我觉得肯定是缺少了发送类型所以在form标签中加入了enctype='multipart/form-data',果然可以获取内容了。
然后就是第二个问题,也是我们通过request.getInputStream()方法获取文件的话,获取的内容不只是只有文件的,即使你表单中只有一个file标签。刚开始我就是犯了这个错误,用拿到的byte数组直接输入或者转成文件都是显示不出来,后来才意识到,拿到了inputStream的bytes还要把文件的内容从中剥离出来才可以。这里提供一个方法,具体实现过程还没有细研究,先附上之后再细看
/**
* 取得图片数据
*
* @param requestData
* @param contentType
* @return
* @throws IOException
*/
private byte[] getImgData(byte[] requestData, String contentType)
throws IOException {
String txtBody = new String(requestData, "GBK");
if (!txtBody.contains("image/jpg") && !txtBody.contains("image/jpeg")&& !txtBody.contains("jpg")) {
return null;
}
String boundarytext = contentType.substring(
contentType.lastIndexOf("=") + 1, contentType.length());
// 取得实际上传文件的起始与结束位置
int pos = txtBody.indexOf("filename=\"");
pos = txtBody.indexOf("\n", pos) + 1;
pos = txtBody.indexOf("\n", pos) + 1;
pos = txtBody.indexOf("\n", pos) + 1;
// 文件描述信息后就文件内容,直到为文件边界为止,从pos开始找边界
int boundaryLoc = txtBody.indexOf(boundarytext, pos) - 4;
ByteArrayOutputStream realdatas = null;
try {
int begin = ((txtBody.substring(0, pos)).getBytes("GBK")).length;
int end = ((txtBody.substring(begin, boundaryLoc)).getBytes("GBK")).length;
realdatas = new ByteArrayOutputStream();
realdatas.write(requestData, begin, end);
return realdatas.toByteArray();
} finally {
if (null != realdatas) {
try {
realdatas.close();
} catch (IOException e) {
logger.error("处理上传图片数据错误:", e);
}
}
}
}
这里的参数就是请求的内容数组bytes以及请求类型,类型的话我们可以通过request.getContentType()方法直接获取,返回值同样是byte数组,返回的byte数组就是我们上传图片的内容了。
返回前端的话,直接利用response就可以。
OutputStream os = response.getOutputStream();
os.write(bytes);
来源:http://www.cnblogs.com/qinglangyijiu/p/7803818.html
0
投稿
猜你喜欢
- 具体代码如下所示:***web.xml***<?xml version="1.0" encoding="
- 前言springboot提供了 spirng-boot-starter-test 以供开发者使用单元测试,在引入 spring-boot-s
- 在实施接口中,我们利用interface语法,将interface从类定义中独立出来,构成一个主体。interface为类提供了接口规范。在
- (注意:本文基于JDK1.8)前言任何一个容器类对象用于持有元素后,总是需要遍历元素的,即挨个去访问每个元素1次,而遍历元素,除了常规的依赖
- 用Stream解决两层List属性求和假设一个人有很多个银行账户,每个银行账户中存有不同金额的存款,那么我们如何用Stream求一组人的所有
- 前言之前在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务
- 线程中断机制提供了一种方法,用于将线程从阻塞等待中唤醒,尝试打断目标线程的现有处理流程,使之响应新的命令。Java 留给开发者这一自由,我们
- 前言记得前段时间的文章么?redis使用位图法记录在线用户的状态,还是需要自己实现一个IM在线用户状态的记录,今天来讲讲另一方案,布隆过滤器
- 本文实例讲述了java版微信公众平台消息接口应用方法。分享给大家供大家参考,具体如下:微信公众平台现在推出自动回复消息接口,但是由于是接口内
- 前言之前做的几个微信小程序项目,大部分客户都有要在微信小程序前端提现的需求。提现功能的实现,自然使用企业付款接口,不过这个功能开通比较麻烦,
- Java原生API并不支持为应用程序设置全局热键。要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C/
- 1 SharedPreferences 介绍SharedPreferences是使用键值对的方式来存储数据的SharedPreference
- JWT可以理解为一个加密的字符串,里面由三部分组成:头部(Header)、负载(Payload)、签名(signature)由base64加
- 前言春节要到了,看惯了前端各种小游戏,确实做得很好,很精致。但是我也要为后端程序员稍微做一点贡献,做一款java版本的【年兽大作战】。这个游
- AOP注解无效,切面不执行的解决想做一个api请求日志,想到使用aop,配置过程中遇到了一个坑,aop不起作用,我的aop是这样的:pack
- 一、ServletConfig讲解1.1、配置Servlet初始化参数在Servlet的配置文件web.xml中,可以使用一个或多个<
- 第一次写上传图片的代码,碰到很多问题。昨天做了整整一天,终于在晚上的时候成功了。大声欢呼。但是,做完之后,还是有很多问题想不通。所以在这里也
- WebFilter.javapackage com.hongyuan.route;import java.io.File;import ja
- 问题原因Springboot get请求是参数过长抛出异常:Request header is too large 的问题错误描述java.
- Spring的主要特性包括IOC和DI,其中DI是IOC的基础。在以前的Spring使用过程中大部分都是使用XML配置文件显式配置sprin