本地上传和下载文件正常,部署后报错java.io.IOException: java.io.FileNotFoundException

找不到指定路径,原因是上传的文件是放在 "/static/files" 目录下的,本地可以;

而项目打包为jar包后,无法对jar包内进行操作,"/static/files"目录失效;

解决办法 是将上传的图片存放在jar包外面,动态的创建一个 "/img" 文件夹来存放文件.

源代码,注释的为本地的操作

 解决过程:可用sout打印出变量的值,来判断是否是想要的地址

/**
     * 上传文件信息,文件信息保存到数据库,文件数据保存在\target\img目录下
     * @param myFile 上传的文件
     * @param session
     * @return 完成后重定向到展示页面
     * @throws IOException
     */
    @RequestMapping("upload")
    public String upload(MultipartFile myFile, HttpSession session) throws IOException {
        //获取用户id
        User user = (User) session.getAttribute("user");
        Integer id=user.getId();
        //获取文件的原始名称
        String oldFileName = myFile.getOriginalFilename();

        //先获取原来的后缀
        String ext = "."+ FilenameUtils.getExtension(oldFileName);

        //生成新的文件名(时间戳+UUID+后缀)
        String newFileName=new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+ UUID.randomUUID().toString().replace("-","")+ ext;

        //法1、动态获取当前项目files目录 (realPath绝对路径)  本地可用,部署报错
//        String realPath= ResourceUtils.getURL("classpath:").getPath()+"/static/files";
        //法2、部署后,文件上传到服务器,在jar包外生成一个img文件夹,用来存放文件
        String realPath = System.getProperty("user.dir") + "/img/";
        System.out.println("绝对路径*******"+realPath);
        //根据日期生成目录
        String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(new Date());

        //绝对路径 + 时间戳
        String dateDirPath = realPath + "/" + dateFormat ;

        File dateDir = new File(dateDirPath);

        //如果文件夹不存在,创建
        if (!dateDir.exists()) {
            dateDir.mkdirs();
        }
        //处理文件上传(将文件数据放入新建的文件夹中)
        myFile.transferTo(new File(dateDir,newFileName));
        //将文件信息放入数据库
        UserFile userFile = new UserFile();
        userFile.setOldFileName(oldFileName).setNewFileName(newFileName).setExt(ext);
//        userFile.setPath("/files/"+dateFormat);
        userFile.setPath("/img/"+dateFormat);
        userFile.setUId(id);
        userFile.setUploadTime(new Date());
        userFileService.saveFile(userFile);
        return "redirect:/file/showAll";
    }

    @RequestMapping("deleteFile")
    public String deleteFile(Integer id) throws FileNotFoundException {
        //根据id查询信息
        UserFile userFile = userFileService.findByFileId(id);
        //删除文件本身
        String realPath=System.getProperty("user.dir") + userFile.getPath();
//        String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static" + userFile.getPath();
        File file = new File(realPath, userFile.getNewFileName());
        if (file.exists()) file.delete();//立即删除
        //接着删除数据库中记录
        userFileService.deleteFileById(id);

        return "redirect:/file/showAll";
    }

    /**
     * 文件下载(一个请求只能对应一个唯一的响应,无返回值)
     */
    @GetMapping("download")
    public void download(String openStyle,Integer id, HttpServletResponse response){
        //获取打开方式(判断是下载还是打开)
        openStyle = openStyle == null ? "attachment" : openStyle;
        FileInputStream is=null;
        ServletOutputStream os=null;
        try {
            //获取文件信息
            UserFile userFile = userFileService.findByFileId(id);
            //根据文件信息中文件名字 和 文件存储路径获取文件输入流(realPath文件下载路径)   部署后报错
//            String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static" + userFile.getPath();
//            String realPath=System.getProperty("user.dir")+"/static" + userFile.getPath();
//            String realPath = System.getProperty("user.dir") + "/img/" + userFile.getPath();
            String realPath=System.getProperty("user.dir") + userFile.getPath();
            System.out.println("realPath********"+realPath);

            //获取文件输入流
            is = new FileInputStream(new File(realPath, userFile.getNewFileName()));
            //附件下载会默认打开,拿流之前设置响应头(attachment下载,inline在线打开)
            String OldNameEncode = URLEncoder.encode(userFile.getOldFileName(), "UTF-8");
            response.setHeader("content-disposition",openStyle+";fileName="+OldNameEncode);
            //获取响应输出流
            os = response.getOutputStream();
            //文件拷贝
            IOUtils.copy(is, os);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                is.close();
                os.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值