背景
最近闲来无事,同事闻了一下上传文件的基本操作,如何用文件流来实现一个文件的上传功能
基本概念
流(Stream)是指在计算机的输入输出操作中各部件之间的数据流动。可以按照数据传输的方向,将流可分为输入流和输出流,它是java中相对比较重要的知识点,无论是考试、面试,还是实际工作过程中,这都是经常能够使用到的身影。希望各位看官们可以更好地了解流的相关知识。
输入流
Java 流相关的类都封装在 java.io 包中,而且每个数据流都是一个对象。所有输入流类都是 InputStream 抽象类(字节输入流)以及 Reader 抽象类(字符输入流)的子类。其中 InputStream 类是字节输入流的抽象类,是所有字节输入流的父类,其层次结构如下图 所示。
Java 中的字符他其实是 Unicode 编码,即双字节,而 InputerStream 是用来对单字节处理的,在处理字符文本时显得不是很方便。这时可以使用 Java中 的文本Reader 类(输入流 ),该类是字符输入流的抽象类,即所有字符输入流的实现都是它的子类,该类的方法与 InputerSteam 类的方法类似,这里不再介绍。
以上是关于输入流的基本概念,下面我们直接上代码。实现我们的文件上传功能
输出流
在 Java 中所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类。其中 OutputStream 类是字节输出流的抽象类,是所有字节输出流的父类,其层次结构如下图所示。
OutputStream 类是所有字节输出流的超类,用于对以二进制的形式将数据写入目标设备,该类是抽象类,不能被实例化。OutputStream 类提供了一系列跟数据输出有关的方法,
代码如下
public ApiResult upload(@NotNull(message = "上传参数不能为空") @RequestParam("file")MultipartFile[] file) throws BaseException{
for (int i = 0; i < file.length; i++) {
String originalFilename = file[i].getOriginalFilename();
String type = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
if(!getPicTypeMap().containsKey(type.toLowerCase())){
throw new ParamException("只允许上传png、jpg格式图片或者pdf");
}
// TODO 此处未做大小显示如果想要限制,放开就好
if(type.equalsIgnoreCase("png") || type.equalsIgnoreCase("jpg") ){
if(file[i].getSize() > 5120){
throw new ParamException("图片超过了限制");
}
}
if(type.equalsIgnoreCase("mp4")){
if(file[i].getSize() > 512000){
throw new ParamException("视频超过了限制");
}
}
if(type.equalsIgnoreCase("pdf") ){
if(file[i].getSize() > 30720){
throw new ParamException("pdf超过了限制");
}
}
/* if(file[i].getSize() > 设定的值){
throw new ParamException("上传内容超过了限制");
}*/
}
ApiResult apiResult = new ApiResult();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
String format = simpleDateFormat.format(new Date());
String realPath = filePath + File.separator + format;
String returnPath = format;
File targetFile = new File(realPath);
if (!targetFile.exists()){
targetFile.mkdirs();
}
FileOutputStream bos = null;
for (int i = 0; i < file.length; i++) {
try {
String fileName = UUID.randomUUID().toString().replace("-","");
//获取文件后缀(.txt)
String extendFileName = file[i].getOriginalFilename().substring(file[i].getOriginalFilename().lastIndexOf('.'));
String str = targetFile + File.separator + fileName + extendFileName;
// 此处是外面要访问的,所以必须添加
returnPath = returnPath + "/" + fileName + extendFileName;
logger.info(str);
bos = new FileOutputStream(str);
bos.write(file[i].getBytes());
apiResult.getData().put("filePath","/" + returnPath);
}catch(FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
logger.info("上传成功");
}
return apiResult;
}
今天的文章到此就结束了,欢迎大家留言交流,也可以点击下方的卡片关注一波
这篇文章2000多字,你却说因为文字段被标记为质量低,以下文字就是为了打破它的文字段而造成的质量低!
相信和我一样遇到这个问题的的小伙伴们,心里也已经暗自问候了这个产品经理的祖总十八代了吧!
算法实在是不敢苟同,文字的长短和文章的质量有毛线的关系吗?
这篇文章因为文字段被标记为质量低,以下文字就是为了打破它的文字段而造成的质量低!
相信和我一样遇到这个问题的的小伙伴们,心里也已经暗自问候了这个产品经理的祖总十八代了吧!
算法实在是不敢苟同,文字的长短和文章的质量有毛线的关系吗?