zoukankan      html  css  js  c++  java
  • java后台图片的上传预览接口 IO流

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

    /**
    * 上传医生照片
    * @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 更特殊的输入或输出方法)
    第六,是否要格式化输出:原则二




    当能力支撑不了野心时,就该静下心来学习!
  • 相关阅读:
    数据结构的理解
    等价、偏序和全序
    等价、偏序和全序
    二叉树与树的理解
    SICP 习题 (2.10)解题总结: 区间除法中除于零的问题
    div:给div加滚动栏 div的滚动栏设置
    textarea文本域宽度和高度(width、height)自己主动适应变化处理
    OSX: 逻辑卷管理系统Core Storage(1)
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
    string实现
  • 原文地址:https://www.cnblogs.com/1234cjq/p/7649444.html
Copyright © 2011-2022 走看看