zoukankan      html  css  js  c++  java
  • html+java超大视频上传解决方案

     上周遇到这样一个问题,客户上传高清视频(1G以上)的时候上传失败。
    一开始以为是session过期或者文件大小受系统限制,导致的错误。
    查看了系统的配置文件没有看到文件大小限制,
    web.xml中seesiontimeout是30,我把它改成了120。
    但还是不行,有时候10分钟就崩了。
    同事说,可能是客户这里服务器网络波动导致网络连接断开,我觉得有点道理。
    但是我在本地测试的时候发觉上传也失败,网络原因排除。
    看了日志,错误为:
    java.lang.OutOfMemoryError Java heap space
    上传文件代码如下:
        public static String uploadSingleFile(String path,MultipartFile file) {
            
            if (!file.isEmpty()) {
                
                    byte[] bytes;
                    try {
                        bytes = file.getBytes();
                        
                        // Create the file on server
                        File serverFile = createServerFile(path,file.getOriginalFilename());
                        BufferedOutputStream stream = new BufferedOutputStream(
                                new FileOutputStream(serverFile));
                        stream.write(bytes);
                        stream.flush();
                        stream.close();
        
                        logger.info("Server File Location="
                                + serverFile.getAbsolutePath());
     
                        return getRelativePathFromUploadDir(serverFile).replaceAll("\\", "/");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        System.out.println(e.getMessage());
                    }
                
            }else{
                System.out.println("文件内容为空");
            }
            return null;    
        }
    乍一看没什么大问题,我在 stream.write(bytes); 这句加了断点,发觉根本就没走到。
    而是在 bytes = file.getBytes(); 就报错了。
    原因应该是文件太大的话,字节数超过Integer(Bytes[]数组)的最大值,导致的问题。
    既然这样,把文件一点点的读进来即可。
    修改上传代码如下:
     
       public static String uploadSingleFile(String path,MultipartFile file) {
            
            if (!file.isEmpty()) {
                
                    //byte[] bytes;
                    try {
                        //bytes = file.getBytes();
                        
                        // Create the file on server
                        File serverFile = createServerFile(path,file.getOriginalFilename());
                        BufferedOutputStream stream = new BufferedOutputStream(
                                new FileOutputStream(serverFile));
                        int length=0;
                        byte[] buffer = new byte[1024];
                        InputStream inputStream = file.getInputStream();
                        while ((length = inputStream.read(buffer)) != -1) {
                            stream.write(buffer, 0, length);
                        }
                        //stream.write(bytes);
                        stream.flush();
                        stream.close();
        
                        logger.info("Server File Location="
                                + serverFile.getAbsolutePath());
     
                        return getRelativePathFromUploadDir(serverFile).replaceAll("\\", "/");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        System.out.println(e.getMessage());
                    }
                
            }else{
                System.out.println("文件内容为空");
            }
            return null;    
        }
        
    效果展示:



    详细代码可以参考一下这篇文章:http://blog.ncmem.com/wordpress/2019/08/09/java%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/

  • 相关阅读:
    libv4l 库【转】
    Leap Motion颠覆操控体验的超精致手势追踪技术【转】
    嵌入式Linux下Camera编程--V4L2【转】
    C语言高级应用---操作linux下V4L2摄像头应用程序【转】
    通过摄像头设备采集一帧数据的例子程序(完整版)【转】
    V4L2 camera 驱动 capture测试程序【转】
    v4l2 spec 中文 Ch01【转】
    Video for Linux Two API Specification Revision 2.6.32【转】
    Video for Linux Two API Specification revision0.24【转】
    OpenCV实践之路——人脸检测(C++/Python) 【转】
  • 原文地址:https://www.cnblogs.com/songsu/p/14174124.html
Copyright © 2011-2022 走看看