CGB2105-Day17
1.Window与Linux系统的链接问题
- 检查虚拟机的网段
- 检查windowsIP地址
- 检查Linux IP 192.168.126.129
- 检查是否可以正常通信
- 如果上述操作都对 但是还是不能正常链接 点击恢复默认设置.之后重新配置
2 .文件上传
2.1 编辑ImageVO
@Data
@Accessors(chain = true)
public class ImageVO {
private String virtualPath; //虚拟路径 动态变化的路径
private String urlPath; //网络地址
private String fileName; //图片名称
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2.2 编辑FileController
/** * 需求分析: 文件上传完成之后,需要返回ImageVO对象 * @param file * @return * @throws IOException */ @PostMapping("/upload") public SysResult upload(MultipartFile file) throws IOException {
<span class="token class-name">ImageVO</span> imageVO <span class="token operator">=</span> fileService<span class="token punctuation">.</span><span class="token function">upload</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//不成功 应该返回null</span> <span class="token keyword">if</span><span class="token punctuation">(</span>imageVO <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token keyword">return</span> <span class="token class-name">SysResult</span><span class="token punctuation">.</span><span class="token function">fail</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token class-name">SysResult</span><span class="token punctuation">.</span><span class="token function">success</span><span class="token punctuation">(</span>imageVO<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
2.3 编辑FileServiceImpl
package com.jt.service;
import com.jt.vo.ImageVO;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Service
public class FileServiceImpl implements FileService{
<span class="token comment">/**
* 规则说明:
* 文件磁盘地址: F:/images/yyyy/MM/dd/uuid.jpg
* 网络访问地址: http://image.jt.com/yyyy/MM/dd/uuid.jpg
*/</span>
<span class="token keyword">private</span> <span class="token class-name">String</span> localDir <span class="token operator">=</span> <span class="token string">"F:/images"</span><span class="token punctuation">;</span> <span class="token comment">//本地磁盘前缀</span>
<span class="token keyword">private</span> <span class="token class-name">String</span> preURLPath <span class="token operator">=</span> <span class="token string">"http://image.jt.com"</span><span class="token punctuation">;</span> <span class="token comment">//网络访问域名</span>
<span class="token comment">/**
* 1.校验文件上传的类型 jpg|png|gif
* 2.应该校验文件是否为恶意程序. 木马.exe.jpg
* 3.为了提高检索效率 应该分目录存储. 1.hash方式 xx/xx/xx/xx 分布不均
* 2.日期格式 yyyy/MM/dd 目录不断增长
* 4.防止文件重名 UUID.jpg
* @param file
* @return
*/</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token class-name">ImageVO</span> <span class="token function">upload</span><span class="token punctuation">(</span><span class="token class-name">MultipartFile</span> file<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token comment">//1.图片类型的校验 正则表达式 aaa.jpg</span>
<span class="token class-name">String</span> fileName <span class="token operator">=</span> file<span class="token punctuation">.</span><span class="token function">getOriginalFilename</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//字符大小写 干扰正则的判断 将所有的文件转化为小写字母</span>
fileName <span class="token operator">=</span> fileName<span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//程序不满足正则, 则用户上传的图片有问题</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>fileName<span class="token punctuation">.</span><span class="token function">matches</span><span class="token punctuation">(</span><span class="token string">"^.+\\.(jpg|png|gif)$"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
<span class="token keyword">return</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">//2. 校验文件是否为恶意程序 判断依据 属性宽度和高度 aa.exe.jpg</span>
<span class="token keyword">try</span> <span class="token punctuation">{<!-- --></span>
<span class="token comment">//该对象是用来专门操作图片的API</span>
<span class="token class-name">BufferedImage</span> bufferedImage <span class="token operator">=</span> <span class="token class-name">ImageIO</span><span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>file<span class="token punctuation">.</span><span class="token function">getInputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> height <span class="token operator">=</span> bufferedImage<span class="token punctuation">.</span><span class="token function">getHeight</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> width <span class="token operator">=</span> bufferedImage<span class="token punctuation">.</span><span class="token function">getWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//如果有一项为0 则表示一定不是正经的图片</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>height <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">||</span> width <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
<span class="token keyword">return</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">//3.分目录存储文件 /yyyy/MM/dd</span>
<span class="token comment">//3.1 准备文件根目录</span>
<span class="token class-name">String</span> dateDir <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SimpleDateFormat</span><span class="token punctuation">(</span><span class="token string">"/yyyy/MM/dd/"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//拼接文件目录 F:/images/2021/MM/dd/</span>
<span class="token class-name">String</span> dirPath <span class="token operator">=</span> localDir <span class="token operator">+</span> dateDir<span class="token punctuation">;</span>
<span class="token class-name">File</span> dirFile <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span>dirPath<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//3.2 判断是否需要创建目录</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>dirFile<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token comment">//不存在目录时,应该创建目录</span>
dirFile<span class="token punctuation">.</span><span class="token function">mkdirs</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">//4.防止文件重名 UUID.后缀</span>
<span class="token class-name">String</span> uuid <span class="token operator">=</span> UUID<span class="token punctuation">.</span><span class="token function">randomUUID</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">"-"</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//获取.的下标位置</span>
<span class="token keyword">int</span> index <span class="token operator">=</span> fileName<span class="token punctuation">.</span><span class="token function">lastIndexOf</span><span class="token punctuation">(</span><span class="token string">"."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//截取文件类型</span>
<span class="token class-name">String</span> fileType <span class="token operator">=</span> fileName<span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span>index<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//拼接新文件路径</span>
<span class="token class-name">String</span> realFileName <span class="token operator">=</span> uuid <span class="token operator">+</span> fileType<span class="token punctuation">;</span>
<span class="token comment">//5.实现文件上传操作</span>
<span class="token comment">//5.1 准备文件的全路径 文件目录/文件名称</span>
<span class="token class-name">String</span> realFilePath <span class="token operator">=</span> dirPath <span class="token operator">+</span> realFileName<span class="token punctuation">;</span>
<span class="token comment">//5.2 实现文件上传</span>
file<span class="token punctuation">.</span><span class="token function">transferTo</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span>realFilePath<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//6.封装返回值结果</span>
<span class="token comment">//封装虚拟路径 /2021/11/11/uuid.jpg</span>
<span class="token class-name">String</span> virtualPath <span class="token operator">=</span> dateDir <span class="token operator">+</span> realFileName<span class="token punctuation">;</span>
<span class="token comment">//封装URL地址 协议名称://域名:端口号/图片虚拟地址</span>
<span class="token class-name">String</span> urlPath <span class="token operator">=</span> preURLPath <span class="token operator">+</span> virtualPath<span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"图片网络地址:"</span><span class="token operator">+</span>urlPath<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//封装VO对象</span>
<span class="token class-name">ImageVO</span> imageVO <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ImageVO</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
imageVO<span class="token punctuation">.</span><span class="token function">setVirtualPath</span><span class="token punctuation">(</span>virtualPath<span class="token punctuation">)</span><span class="token punctuation">;</span>
imageVO<span class="token punctuation">.</span><span class="token function">setUrlPath</span><span class="token punctuation">(</span>urlPath<span class="token punctuation">)</span><span class="token punctuation">;</span>
imageVO<span class="token punctuation">.</span><span class="token function">setFileName</span><span class="token punctuation">(</span>realFileName<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> imageVO<span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token comment">//如果程序执行报错,则返回null</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
2.4 代码调试
图片网络地址: http://image.jt.com/2021/08/11/bcde4a39f32a41b287f3f7b485e80d82.jpg
之后切换为磁盘地址:
F:/images/2021/08/11/bcde4a39f32a41b287f3f7b485e80d82.jpg
2.5 文件删除操作
2.5.1 页面分析
2.5.2 文件上传业务接口
- 请求路径: http://localhost:8091/file/deleteFile
- 请求类型: delete
- 请求参数:
参数名称 | 参数说明 | 备注 |
---|---|---|
virtualPath | 文件上传的虚拟的路径 | 删除时需要磁盘路径一起删除 |
- 返回值结果:
参数名称 | 参数说明 | 备注 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 可以为null |
2.5.3 编辑FileController
/** * 需求: 实现图片删除 * URL: http://localhost:8091/file/deleteFile?virtualPath=xxx * 参数: virtualPath= /2021/11/11/xxx.jpg * 返回值结果: SysResult */ @DeleteMapping("/deleteFile") public SysResult deleteFile(String virtualPath){
fileService<span class="token punctuation">.</span><span class="token function">deleteFile</span><span class="token punctuation">(</span>virtualPath<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token class-name">SysResult</span><span class="token punctuation">.</span><span class="token function">success</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
2.5.3 编辑FileServiceImpl
@Override
public void deleteFile(String virtualPath) {
//1.准备文件的全路径 本地路径 + 虚拟地址
String path = localDir + virtualPath;
//2.将路径封装为对象
File file = new File(path);
//3.实现文件删除
file.delete();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3 .项目部署流程图
了解未来3天做的任务. 理解:文件上传路径的作用
3.1 .项目发布修改说明
3.1.1 路由地址修改
3.1.2 文件上传路径说明
3.1.3 文件上传路径
3.1.4 动态获取端口号
@RestController @CrossOrigin //@PropertySource("classpath:/xxxx.properties") public class PortController { //spring容器启动时,自动的加载application.yml文件 //需求:如何动态获取端口!!! @Value("${server.port}") private Integer port;
<span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span><span class="token string">"/getPort"</span><span class="token punctuation">)</span> <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getPort</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token keyword">return</span> <span class="token string">"当前服务器端口号:"</span><span class="token operator">+</span>port<span class="token punctuation">;</span> <span class="token punctuation">}</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
4. Linux系统介绍
4.1 下载软件
URL: https://mobaxterm.mobatek.net/download.html
4.2 创建远程链接
4.3 远程链接测试
双机链接之后,如图展现即可,如果链接超时 检查window ping linux IP是否正常
4.3 Linux介绍
说明: 课堂笔记以文档为主.