zoukankan      html  css  js  c++  java
  • Request中通过文件流获取文件

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

    /**
    * 获取文件相信信息
    * @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;
    }
    }

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

  • 相关阅读:
    hdu 1455 N个短木棒 拼成长度相等的几根长木棒 (DFS)
    hdu 1181 以b开头m结尾的咒语 (DFS)
    hdu 1258 从n个数中找和为t的组合 (DFS)
    hdu 4707 仓鼠 记录深度 (BFS)
    LightOJ 1140 How Many Zeroes? (数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3652 B-number (数位DP)
    HDU 5900 QSC and Master (区间DP)
    HDU 5901 Count primes (模板题)
    CodeForces 712C Memory and De-Evolution (贪心+暴力)
  • 原文地址:https://www.cnblogs.com/ghsy/p/6912760.html
Copyright © 2011-2022 走看看