上传图片接口    图片保存到服务器(适用于任何文件)

/** * 上传医生照片 * @param request * @return * @throws Exception * @throws IOException */@RequestMapping(value = "uploadfile")public Object uploadfile(HttpServletRequest request) throws Exception, IOException {    MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;    String logoPathDir = fileConfig.getPersonImageURL();   //从配置文件中获取服务器保存路径    // 根据真实路径创建目录    File logoSaveFile = new File(logoPathDir);    if (!logoSaveFile.exists()){        logoSaveFile.mkdirs();    }    // 页面控件的文件流    MultipartFile multipartFile = multipartRequest.getFile("file");    // 获取文件的后缀    String suffix = multipartFile.getOriginalFilename().substring(            multipartFile.getOriginalFilename().lastIndexOf("."));    // 使用UUID生成文件名称    String logImageName = UUID.randomUUID().toString() + suffix;// 构建文件名称    // 拼成完整的文件保存路径加文件    String fileName = logoPathDir + logImageName;    File file = new File(fileName);    try {        multipartFile.transferTo(file);    } catch (IllegalStateException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    }    // 打印出上传到服务器的文件的绝对路径    Map<String, Object> result=new HashMap<String, Object>();    result.put("imgname", logImageName);    result.put("imgnamepath", fileName);    result.put("message", "上传成功");    result.put("statu", 1);    return result;}
第二种写法  io流
/** * 上传版本文件 * @param request * @param response * @return * @throws Exception * @throws IOException */@RequestMapping(value = "uploadfiledemo")public Object uploadfiledemo(HttpServletRequest request,MultipartHttpServletRequest multiReq,HttpServletResponse response) throws Exception, IOException {    // 获取上传文件的路径    String uploadFilePath = multiReq.getFile("file").getOriginalFilename();    // 截取上传文件的后缀    String uploadFileSuffix = uploadFilePath.substring(            uploadFilePath.lastIndexOf("."));    // 使用UUID生成文件名称    String filename = UUID.randomUUID().toString() + uploadFileSuffix;// 构建文件名称    FileOutputStream fos = null;    FileInputStream fis = null;    try {        fis = (FileInputStream) multiReq.getFile("file").getInputStream();        fos = new FileOutputStream(new File(fileConfig.getAppFileURL() + filename));        byte[] temp = new byte[1024];        int i = fis.read(temp);        while (i != -1) {            fos.write(temp, 0, temp.length);            fos.flush();            i = fis.read(temp);        }    } catch (IOException e) {        e.printStackTrace();    } finally {        if (fis != null) {            try {                fis.close();            } catch (IOException e) {                e.printStackTrace();            }        }        if (fos != null) {            try {                fos.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }    // 打印出上传到服务器的文件的绝对路径    Map<String, Object> result=new HashMap<String, Object>();    result.put("appFileName", filename);//文件名称    result.put("appFilePath", fileConfig.getAppFileURL() + filename);//文件带路径的名称    result.put("message", "上传成功");    result.put("statu", 1);    return result;}
------------------------------------------------------------------------------------------------------------------------------------------图片预览接口  不需return   将文件流输出即可
/** * 传入要预览的图片名称 * * @param path */@RequestMapping(value = "/downloadpicture")private void downloadPicture(String path, HttpServletResponse response) throws IOException {    //获取文件保存路径    String logoPathDir = fileConfig.getPersonImageURL();        path = logoPathDir + path;         //获取服务器上指定的图片路径    InputStream in = null;    ServletOutputStream sos = null;    try {        File file = new File(path);        in = new FileInputStream(file);        sos = response.getOutputStream();        byte[] b = new byte[1024];        while (in.read(b) != -1) {sos.write(b);    //输出        }        sos.flush();           //刷新    } catch (Exception e) {        e.printStackTrace();    } finally {        try {            in.close();        //关闭文件读取流,输出流            sos.close();        } catch (IOException e) {            e.printStackTrace();        }    }}
---------------------------------------------------------------------------------------------------------------------------------------

文件下载  保存到本地 需要设置文件头,后缀名等信息  无法使用  文件需要使用FileInputStream

/**
* 传入要下载的app文件的url,将url所对应的文件下载到本地
*
* @param path
*/
@RequestMapping(value = "/downloadappfile")
private void downloadappfile(@RequestParam(value="appFileName",defaultValue="")String path,HttpServletResponse response) throws IOException {
//获取文件保存路径
String logoPathDir = fileConfig.getAppFileURL();
path = logoPathDir + path;
InputStream in = null;
ServletOutputStream sos = null;
try {
File file = new File(path);
response.setCharacterEncoding("utf-8");
//设置Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename="+file.getName());
//设置文件MIME类型
response.setContentType(new MimetypesFileTypeMap().getContentType(file));

in = new FileInputStream(file);
sos = response.getOutputStream();
byte[] b = new byte[1024];
while (in.read(b) != -1) {
sos.write(b);
}
sos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
sos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

第二种写法  使用BufferedInputStream改善读取性能

 /**     * 传入要下载的app文件的url,将url所对应的文件下载到本地     * @param path     */    @RequestMapping(value = "/downloadappfiledemo")    private void downloadappfiledemo(@RequestParam(value="appFileName",defaultValue="")String path,HttpServletResponse response) throws IOException {        //获取文件保存路径        String logoPathDir = fileConfig.getAppFileURL();        path = logoPathDir + path;response.setHeader("content-type", "application/octet-stream");response.setContentType("application/octet-stream");byte[] buff = new byte[1024];BufferedInputStream bis = null;OutputStream os = null;try {    File file = new File(path);    response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());os = response.getOutputStream();bis = new BufferedInputStream(new FileInputStream(file));int i = bis.read(buff);while (i != -1) {  os.write(buff, 0, buff.length);os.flush();i = bis.read(buff);}} catch (IOException e) {e.printStackTrace();} finally {try {bis.close();} catch (IOException e) {e.printStackTrace();}}

    }

InputStream不可以读取文件,它是一个Abstract的类,根本不可能实例化,是所有输入流的基类。而FileInputStream是InputStream的一个实现类,用于读取诸如图像数据之类的原始字节流。第三种写法write的flush,是想要不关闭write流的情况下,将已写入缓存的内容发出去。read只是读操作,没有flush。out不关,是因为out来自socket,socket关了,就不用再关一次out了
/** * 传入要下载的app文件的url,将url所对应的文件下载到本地 * @param path */@RequestMapping(value = "/downloadappfile")private Object downloadappfile(@RequestParam(value="appFileName",defaultValue="")String path,HttpServletResponse response) throws IOException {    //获取文件保存路径    String logoPathDir = fileConfig.getAppFileURL();    path = logoPathDir + path;    File file = new File(path);    //如果文件不存在    if(!file.exists()){        return new Response("999999","系统找不到指定文件");    }    response.reset(); // 必要地清除response中的缓存信息    response.setContentType("application/octet-stream; charset=utf-8");    response.setCharacterEncoding("utf-8");  // 设置response的Header    response.setHeader("Content-Disposition", "attachment;filename="+file.getName());    response.addHeader("Content-Length", "" + file.length());   //设置请求头信息写入文件大小    FileInputStream fis = null;    BufferedInputStream bis = null;    try {        fis = new FileInputStream(file);        byte[] buffer = new byte[1024];        bis = new BufferedInputStream(fis);        OutputStream os=response.getOutputStream();        int i = bis.read(buffer);        while (i != -1) {            os.write(buffer, 0, i);            i = bis.read(buffer);        }    } catch (Exception e) {        e.printStackTrace();    } finally {        if (bis != null) {            try {                bis.close();            } catch (IOException e) {                e.printStackTrace();            }        }        if (fis != null) {            try {                fis.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }    return null;}
------------------------------------------------------------------------------------------------------------------

多文件上传

public static String upload(HttpServletRequest request, String DirectoryName) throws IllegalStateException,
IOException {
// 创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession()
.getServletContext());
// 图片名称
String fileName = null;
// 判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
// 转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
// 记录上传过程起始时的时间,用来计算上传时间
// int pre = (int) System.currentTimeMillis();
// 取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
if (file != null) {
// 取得当前上传文件的文件名称
String myFileName = file.getOriginalFilename();
// 如果名称不为“”,说明该文件存在,否则说明该文件不存在
if (myFileName.trim() != "") {
// 获得图片的原始名称
String originalFilename = file.getOriginalFilename();
// 获得图片后缀名称,如果后缀不为图片格式,则不上传
String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
if (!fileTypes.contains(suffix)) {
continue;
}
// 获得上传路径的绝对路径地址(/upload)-->
String realPath = request.getSession().getServletContext().getRealPath("/" + DirectoryName);
System.out.println(realPath);
// 如果路径不存在,则创建该路径
File realPathDirectory = new File(realPath);
if (realPathDirectory == null || !realPathDirectory.exists()) {
realPathDirectory.mkdirs();
}
// 重命名上传后的文件名 111112323.jpg
fileName = UUID.randomUUID().toString() + suffix;// 构建文件名称
// 定义上传路径 .../upload/111112323.jpg
File uploadFile = new File(realPathDirectory + "\\" + fileName);
System.out.println(uploadFile);
file.transferTo(uploadFile);
}
}
// 记录上传该文件后的时间
// int finaltime = (int) System.currentTimeMillis();
// System.out.println(finaltime - pre);
}
}
return fileName;
}

------------------------------------------------------------------------------------------------------------------------------------------
Java IO 的一般使用原则 :  
一、按数据来源(去向)分类:
1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )
2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )
3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )
4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )
5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )
二、按是否格式化输出分:
1 、要格式化输出: PrintStream, PrintWriter
三、按是否要缓冲分:
1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )
四、按数据格式分:
1 、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类
2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类
五、按输入输出分:
1 、输入: Reader, InputStream 类型的子类
2 、输出: Writer, OutputStream 类型的子类
六、特殊需要:
1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter
2 、对象输入输出: ObjectInputStream, ObjectOutputStream
3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4 、合并输入: SequenceInputStream
5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
首先,考虑最原始的数据格式是什么: 原则四
第二,是输入还是输出:原则五
第三,是否需要转换流:原则六第 1 点
第四,数据来源(去向)是什么:原则一
第五,是否要缓冲:原则三 (特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)
第六,是否要格式化输出:原则二

转载于:https://www.cnblogs.com/1234cjq/p/7649444.html

java后台图片的上传预览接口 IO流相关推荐

  1. C#实现winform下图片的上传预览保存以及在桌面应用系统的应用

    C#实现winform下图片的上传预览保存以及在桌面应用系统的应用 图片的上传.预览.保存操作在许多应用系统中经常需要用到,比如员工的头像即为一个典型的案例.在很多应用系统中,比如C#的B/S.C/S ...

  2. jq php异步上传图片,PHP+Ajax实现图片异步上传预览

    说道上传图片,大家并不陌生,不过,在以后开发的项目中,可能并不会让你使用提交刷新页面式的上传图片,比如上传头像,按照常理,肯定是在相册选择照片之后,确认上传,而肯定不会通过form表单,点击submi ...

  3. 模拟QQ心情图片上传预览

    出于安全性能的考虑,目前js端不支持获取本地图片进行预览,正好在做一款类似于QQ心情的发布框,找了不少jquery插件,没几个能满足需求,因此自己使用SWFuplad来实现这个图片上传预览. 先粘上以 ...

  4. html 手机qq图片预览,模拟QQ心情图片上传预览示例

    出于安全性能的考虑,目前js端不支持获取本地图片进行预览,正好在做一款类似于QQ心情的发布框,找了不少jquery插件,没几个能满足需求,因此自己使用SWFuplad来实现这个图片上传预览. 先粘上以 ...

  5. 简单快捷的实现图片上传预览效果

    简单快捷的实现图片上传预览效果 如何简单快捷的实现图片上传预览效果,想必这是绝大多数的c#新手遇到的一个小难题. 我学习c#也有一年的时间了,就把一个简单的方法给大家看看. 如下: readAsDat ...

  6. imgareaselect + php 裁剪和上传,jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能

    本文主要介绍了jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一,需要的朋友可以参考下,希望能帮助到大家. 上一节随笔中,我们已经知道了关于jQuery插件ImgAreaS ...

  7. java实现文件上传预览_jsp+springmvc实现文件上传、图片上传和及时预览图片

    1.多文件上传:http://blog.csdn.net/a1314517love/article/details/24183273 2.单文件上传的简单示例:http://blog.csdn.net ...

  8. JAVA实现一个图片上传预览功能

    这个小项目主要使用java实现了一个简单的图片上传预览功能,废话不多说,先上实现成果 ^ _ ^

  9. JAVA微信公众号开发第8篇JSSDK图片上传预览

    简介 博主微信JSSDK&图片上传预览基于微信分享做拓展,所以一些配置操作请点击查阅JAVA微信公众号开发第7篇JSSDK&微信分享博文 页面 <html><head ...

最新文章

  1. C++和C语言中enum 如何使用
  2. Distcp 分布式拷贝
  3. c++实现ftp服务器_第三步,尝试用树莓派搭建你的云计算平台和服务器
  4. OpenGL环境下的射线选择
  5. 用Python玩转时序数据
  6. 【paper and code】AC-GAN
  7. css:transform,transition,animation总结
  8. B. Forgery
  9. java教师考勤系统,javaweb课堂考勤管理系统
  10. matlab imshow伪彩色,实验7:彩色图像及伪彩色处理
  11. linux查看网卡光强,LINUX OV5640驱动
  12. 电脑自动跳出计算机管理员登陆界面,解决运行wegame总是弹出用户账户控制界面的方法...
  13. 切比雪夫不等式例题讲解_数学广角:切比雪夫最佳逼近直线
  14. 虚拟小镇意识保存~认识脑电波
  15. 权重 缩写 英文_常用英语术语缩写--采购
  16. getValue()方法 java_【Java 】实用方法
  17. 如何基于4P理论做运营?
  18. 图解组策略配置禁止修改IE主页
  19. Sherlock视觉,支持任意相机,我们是专业Sherlock视觉 sherlock支持二次开发,同时也支持 VB,VC,C#的界面封装
  20. 如果计算机正执行屏幕保护程序 当用户,计算机一级考试参考试题(含答案)章节一.doc...

热门文章

  1. jee websocket搭建总结
  2. python学习笔记七
  3. 【陷阱】交换排序中交换动作的陷阱
  4. onbeforeunload与onunload事件(转)
  5. 电子商务(六)-作业题解-第3章
  6. cnn stride and padding_卷积神经网络(CNN) 第 4 课(上)
  7. Docker 集群 图形化显示 Visualizer
  8. 设计模式-UML图简单介绍
  9. hdu3756 三分求最小圆锥
  10. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器值并存档 )