发表于: 2019-10-31 23:42:17

1 5799


今天完成的事:
1、学习IO流基础知识。
一个流可以理解为一个数据的序列,输入流代表从一个源读取数据,输出流表示向一个目标写数据。
(1)读取控制台输入
创建一个BufferedReader对象,使用 read()方法从控制台读取字符。而调用read()方法会从控制台读取一个字符,并转为整数值返回,流结束时返回-1。

因为read方法返回的是整数值,所以需要类型转换为char。在控制台输入一个单词,会依次读取并输出在控制台,当输入q时,方法结束。

使用 readLine()方法可以读取字符串,也就是输入一个单词会直接输出该单词,而不是一个一个输出字符,此处输入end则方法结束。
JDK5后的版本可以使用Scanner类来获取控制台的输入。

(2)控制台输出
控制台输出常用的就是 print()和println()方法,都是由类PrintStream定义,System out 是该类对象的一个引用。这里介绍的 write()方法不常用,没有多看。
(3)读取文件
较为重要的是FileInputStream流和FileOutputStream流。
FileInputStream流从文件读取数据。

FileOutputStream流用来创建文件并向文件写数据。

使用FileOutputStream流只能创建文件,不能创建文件夹,所以文件夹路径必须是存在的路径。

这样输入会出现乱码,后期有需要用到这样输入的再看看怎么解决。

(4)创建目录
使用 mkdirs()方法,可以创建文件夹,以及路径上没有的父文件夹。

而使用 mkdir()方法只能创建路径最后的文件夹,且路径中父文件夹必须都存在。成功返回true,失败返回false。
所以建议使用 mkdirs()方法,路径存在的父文件夹存在就不创建,不存在就会自动创建。

(5)读取目录
使用 new File()方法创建一个文件对象,可以用 isDirectory()方法判断该文件对象是否是目录,是目录则返回true,并且可以调用 list()方法提取文件夹中包含的内容,再遍历依次创建每个文件/文件夹的文件对象,并判断是否是目录。

(6)删除目录
删除时,需注意必须保证目录下没有其他文件才能删除。
这里有递归调用,不断查询是否有子目录,没有则删除。

2、实现图片上传。
图片上传的地址可以是在项目里,也可以是本地电脑里,也可以上传到云服务器上。
如果将图片放在项目内,在图片较多的情况下,项目文件会很大,也不方便,这里我是将图片直接上传到本地电脑里,通过配置虚拟路径,可以在浏览器上直接访问上传图片。
如果需要上传到云服务器上,直接修改上传路径即可。但是上传到云服务器上,会遇到权限问题,也很麻烦。。
另外在查看时,还有上传到Tomcat下的目录中的,那样的话每次重启服务器图片就会消失,并不实用。
在Tomcat中配置虚拟路径,当访问该虚拟路径时,会自动找到你的本地路径,查看对应的图片。如下,打开安装目录的server.xml文件,添加如下语句,其中path是虚拟路径,doBase是真正的本地路径。
这种方法适用于war包在Tomcat中运行的情况。

如果是使用idea启动Tomcat,则配置Tomcat中的server.xml文件就不起作用了,需要在idea中进行下列操作,选择图片上传路径即可。


需要注意的是,这里的application context 需要配上你的虚拟地址“/image/”。

在端口8080下,直接添加虚拟地址“/image/”,加上图片全称,即可访问该图片。

尝试后发现,mp4格式的视频也可以上传,端口后添加虚拟路径“/image/”,再加视频名称,即可访问该视频。

所以在controller中,还需要使用下面方法判断文件类型,这里没有尝试,有需要再添加。

编写上传图片的工具类。
public class ImageUtil {
    // 上传图片,尝试后发现视频也可以上传
    public static String upload(MultipartFile pictureFile) throws IOException {
        // 装配图片地址
        String imgPath = null;
        // 判断pictureFile不为空,则上传图片
        if(pictureFile!=null && !pictureFile.isEmpty()){
            // 使用 UUID 给图片重命名,并去掉四个“-”
            String name = UUID.randomUUID().toString().replaceAll("-", "");
            // 获取图片的后缀名称
            String ext = pictureFile.getOriginalFilename();
/*            //获得文件类型(可以判断如果不是图片,禁止上传)
            String contentType=user.getFile().getContentType();*/
            // 设置图片上传路径,这里是获得物理路径的 webapp 所在路径,并设置
/*            String url = request.getSession().getServletContext()
                    .getRealPath("/upload");*/
            // 设置图片上传路径,我是将图片存在本地的文件夹中
            String url = "D:\\Java-jnshu\\task3\\image";
            // 检验文件夹是否存在,不存在则创建一个文件夹,即路径必须正确
            isFolderExists(url);
            // 将重名命后的图片上传到图片上传路径
            pictureFile.transferTo(new File(url,name + "." + ext));
            // 装配后的图片地址,包含虚拟路径、图片名称、后缀
            imgPath = "/image/" + name + "." + ext;
        }
        return imgPath;
    }
     // 验证文件夹是否存在,不存在则创建一个文件夹,即路径必须正确
    public static boolean isFolderExists(String strFolder){
        File file = new File(strFolder);
        if (!file.exists())
        {
            if (file.mkdir())
            {
                return true;
            }
            else{
                return false;
            }
        }
        System.out.println("-----------------文件上传路径:"+strFolder);
        return true;
    }
}
controller类方法
    // 添加作品信息,上传图片
    @RequestMapping(value = "/work/add",method = RequestMethod.POST)
    public ModelAndView addWork(Work work,MultipartFile multipartFile,ModelAndView mav) throws IOException {
        // 调用 ImageUtil 类的图片上传方法,返回图片的上传路径
        String imageName = ImageUtil.upload(multipartFile);
        work.setBrief("简介如此");
        work.setThumbnail("缩略图");
        work.setVideo("我是视频链接");
        // 将图片的上传路径保存到数据库
        work.setOriginal(imageName);
        work.setFirWorks("我是一级");
        work.setSecWorks("我是二级");
        work.setStatus(true);
        work.setCreateAt(System.currentTimeMillis());
        work.setUpdateAt(System.currentTimeMillis());
        work.setUpdateBy("我来垫后");
        workService.insertWork(work);
        mav.setViewName("image");
        return mav;
    }
图片添加页面

图片展示页面

springmvc.xml中的配置

所需的jar包

明天计划的事:
1、完成nginx的动静分离。
2、编写任务三其余功能接口。
遇到的问题:
收获:
1、学习IO流基础知识,控制台输入输出,目录的创建、读取、删除。
2、实现图片的上传功能。

返回列表 返回列表
评论

    分享到