第一次写博客,希望能帮到以后接触到这里的同学,废话不多说,面对疾风吧。

/**
* 获取文件相信信息
* @param request HttpServletRequest实例
* @param imgPath 图片路径
* @param fileName 图片名
* @param path ftp保存的位置
* @return
* @throws IOException
*/
public static Map getFileMessage(HttpServletRequest request,String imgPath,String fileName,String path) throws IOException {
Map map=null;
if (ServletFileUpload.isMultipartContent(request)){
//创建ServletFileUpload实例
ServletFileUpload fileUpload = new ServletFileUpload();
FileItemIterator iter=null;
FileItemStream item=null;
InputStream is = null;
try {
//解析request请求 返回FileItemStream的iterator实例
iter = fileUpload.getItemIterator(request);
//迭代取出
while (iter.hasNext()){
item = iter.next();//获取文件流
if(!item.isFormField()){

//为什么要这么取出这个流呢,因为request.getInputStream()中,表单提交上来的不仅仅包含了文件,还带有参数,就算不带参数,也还有request中本身的一些其他东西(ps:没有研究过,但是试过不带参数拿到的流也是不对的。)直接拿会导致读取出来的文件变大,图片读取失败

//这里主要针对图片来写的,因为我用到的是转成图片,获取图片属性。
is = item.openStream();
if (is.available()>0){
map=saveToImgByInputStream(is, imgPath, fileName,path);
}
}
}
} catch (Exception e) {
e.printStackTrace();
// return is;
return map;
} finally {
fileUpload=null;
iter=null;
if(is!=null){
is.close();
is=null;
}
item=null;
}
}
//return is;
return map;
}

/**
* 获取文件属性
* @param in InputStream
* @param imgPath 图片的保存路径
* @param imgName 图片的名称
* @return
* @throws IOException
*/
@SuppressWarnings( { "rawtypes", "unchecked", "null" } )
public static Map saveToImgByInputStream(InputStream in,String imgPath,String imgName,String path) throws IOException{

//将流转成临时存储文件,拿到属性存储在map里面然后删除临时文件。
Map map =null;
FileOutputStream fos=null;
BufferedImage bufferedImage=null;
File file,f;
byte[] b=null;
FileInputStream fis=null;
try {
map =new HashMap();
// 将上面生成的图片格式字符串 imgStr,还原成图片显示
file=new File(imgPath,imgName);//可以是任何图片格式.jpg,.png等
fos=new FileOutputStream(file);
b = new byte[1024];
int nRead = 0;
while ((nRead = in.read(b)) != -1) {
fos.write(b, 0, nRead);
}
fos.flush();
map.put("size", getPrintSize(file.length()));
bufferedImage = ImageIO.read(file);
map.put("width", bufferedImage.getWidth());
map.put("height", bufferedImage.getHeight());

//这里为什么要新得到一个流呢,因为上面流写入完了,发现传到存储服务器的文件是空的,个人猜测,流空了,没有深入研究过=.=
f=new File(imgPath+"/"+imgName);
fis=new FileInputStream(f);

//这个方法是将文件传到存储服务器,里面涉及到公司源码,不便透露
saveFileToFtpServer(fis, path, imgName);
map.put("url",Constant.systemUserCenterFileServerUrl+path+"/"+imgName);
} catch (Exception e) {
e.printStackTrace();
map.put(UserCenterResultEnum.OPEN_OUTPUTSTREAM_FAILED.getCode(), UserCenterResultEnum.OPEN_OUTPUTSTREAM_FAILED.getDesc());
} finally {
bufferedImage = null;
file=null;
if(fos!=null){
fos.close();
}
if(fis!=null){
fis.close();
fis=null;
}
f=null;
if(in!=null){
in.close();
}
delFolder(imgPath+"/"+imgName);
}
return map;
}

/**
* 将文件大小b转为mb
* @param size
* @return
*/
public static String getPrintSize(long size) {
//如果字节数少于1024,则直接以B为单位,否则先除于1024,后3位因太少无意义
if (size < 1024) {
return String.valueOf(size) + "B";
} else {
size = size / 1024;
}
//如果原字节数除于1024之后,少于1024,则可以直接以KB作为单位
//因为还没有到达要使用另一个单位的时候
//接下去以此类推
if (size < 1024) {
return String.valueOf(size) + "KB";
} else {
size = size / 1024;
}
//if (size < 1024) {
//因为如果以MB为单位的话,要保留最后1位小数,
//因此,把此数乘以100之后再取余
size = size * 100;
return String.valueOf((size / 100)) + "."+ String.valueOf((size % 100)) + "MB";
/*} else {
//否则如果要以GB为单位的,先除于1024再作同样的处理
size = size * 100 / 1024;
return String.valueOf((size / 100)) + "."
+ String.valueOf((size % 100)) + "GB";
} */
}

/**
* 删除指定文件或者指定文件夹下的文件
* @param folderPath 路径
*/
public static void delFolder(String folderPath) {
File myFilePath=null;
try {
//delAllFile(folderPath); // 删除完里面所有内容
myFilePath = new File(folderPath);
myFilePath.delete(); // 删除空文件夹
} catch (Exception e) {
e.printStackTrace();
}finally {
myFilePath=null;
}
}

以上都是代码,希望能帮到阅读的人

Request中通过文件流获取文件的更多相关文章

  1. Java IO流之【缓冲流和文件流复制文件对比】

    与文件流相比,缓冲流复制文件更快 代码: package Homework; import java.io.BufferedOutputStream; import java.io.File; imp ...

  2. C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

    迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...

  3. 用户态与内核态 & 文件流与文件描述符 简介【转】

    转自:https://www.cnblogs.com/Jimmy1988/p/7479856.html 用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平 ...

  4. 用户态与内核态 & 文件流与文件描述符 简介

    用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平台都支持该库函数,因此依赖该库的程序可移植性好: System Function:系统调用函数,与系统内 ...

  5. HDFS 读取、写入、遍历文件夹获取文件全路径、append

    版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/37573081 1.从HDFS中 ...

  6. 【原创】ABAP根据文件路径获取文件所在目录(续)

    在上一篇文章<ABAP根据文件路径获取文件所在目录>中,我主要的思路是采用 “SPLIT dobj AT sep INTO TABLE result_tab” 句型将文件全路径按分隔符“\ ...

  7. [Java] 通过文件流拷贝文件

    package test.stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  8. Java中常用IO流之文件流的基本使用姿势

    所谓的 IO 即 Input(输入)/Output(输出) ,当软件与外部资源(例如:网络,数据库,磁盘文件)交互的时候,就会用到 IO 操作.而在IO操作中,最常用的一种方式就是流,也被称为IO流. ...

  9. java中的IO流之文件复制

    O(∩_∩)O哈哈~ 1.综述 一门成熟的语言肯定具备的几个模块:IO,通信,线程,UI...... Java作为一门成熟的程序语言,其IO流是比较复杂的.上个图大家感受下: 简单分析一下,IO分为两 ...

随机推荐

  1. FreeBSD内核之中的一个 ALQ机制的使用

    背景: 笔者由于一个项目,这段时间在使用FreeBSD进行内核模块的编程. 之前做过一段时间的Linux下驱动模块编程.对Linux下的模块编程还算熟悉. 如今突然转到FreeBSD下.尽管Linux ...

  2. Android 重写onBackPressed()方法 遇到的问题

    1.resultCode的值一直为0 问题描述:AActivity调用startActivityForResult()方法,启动BActivity,然后在BActivity的onBackPressed ...

  3. dp状态压缩

    dp状态压缩 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的就是那种状态很多,不容易用一般的方法表示的动态规划问题,这个就更加的难于把握了.难点在于以下几个方面:状 ...

  4. 云-阿里云-OSS:对象存储 OSS

    ylbtech-云-阿里云-OSS:对象存储 OSS 对象存储服务(Object Storage Service,OSS)是一种海量.安全.低成本.高可靠的云存储服务,适合存放任意类型的文件.容量和处 ...

  5. 数据结构C++,线性表的实现

    #include <iostream>#include <sstream>#include <fstream>#include <cmath>#incl ...

  6. Django day14(一) cookie

    一: Cookie 1.  Cookie是什么?存储在客户端浏览器上的键值对 2. 原理: 是服务器产生,发给客户端浏览器,浏览器保存起来,下次发请求,会携带这个键值对到服务器 4. Cookie的覆 ...

  7. 管理mysql数据严格模式,和安全模式处理

    最近使用mysql数据库高一点的版本遇到了,插入和修改等语句失败情况.语句没有错误,但是workbench提示 Field 'id' doesn't have a default value.原因是 ...

  8. 前端面试基础-html篇之H5新特性

    h5的新特性(目前个人所了解)如下 语义化标签 表单新特性 视频(video)和音频(audio) canvas画布 svg绘图 地理定位 为鼠标提供的拖放API webworker (重点)Stor ...

  9. VC常用代码之创建进程

    作者:朱金灿 来源:http://blog.csdn.net/clever101 创建进程是编程开发的常用操作.Windows中的创建进程采用API函数CreateProcess实现.下面是一个使用例 ...

  10. dubbo之回声测试

    回声测试 回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控. 所有服务自动实现 EchoService 接口,只需将任意服务引用强制转型为 EchoSe ...