发表于: 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、实现图片的上传功能。
评论