后端实习经历
2021-07-22
springboot文件上传
下载:
先上代码
@GetMapping(path = "/files/{filename:.+}")
@ResponseBody
public ResponseEntity<Resource> serveFile(@PathVariable String filename) {
// 根据文件名读取文件
Resource file = storageService.loadAsResource(filename);
// @ResponseBody 用于直接返回结果(自动装配)
// ResponseEntity 可以定义返回的 HttpHeaders 和 HttpStatus (手动装配)
// ResponseEntity.ok 相当于设置 HttpStatus.OK (200)
// CONTENT_DISPOSITION 该 标志将通知浏览器启动下载
System.out.print(filename);
return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"").body(file);
}
由于惯性思维,以为在url调用接口时{filename:.+}这部分也要原封不动的抄上去。经过师傅的提醒,发现这个位置写的是文件名。
然而,报错:404 not found ,而且这个错误没通过json或text表现出来,而是在postman上很小的一块地方标注,迷惑了我好久。
要解决这个问题,师父让我先在拿文件的代码处断点。也就是这一条。
Resource file = storageService.loadAsResource(filename);
再通过“ctrl+左键”一层层看是从哪里下载的文件,(虽然我还是没太理解),最后发现是在“dir_upload"中下载(好像是)。别以为发现这个就算完事了。不能先放文件再运行程序,否则程序运行时有一步会清空该文件夹。所以要在IDEA显示运行完后,已经有进程时,再放文件,然后在Postman中Get。
总之,这个degub的思路很重要。
上传
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public String upload(MultipartFile file1) {
if (file1 == null) {
return null;
}
String fileName = file1.getOriginalFilename();
System.out.println("文件名:" + fileName);
String filePath = "/opt/niuyuanzhuo";
File dest = new File(filePath, fileName);
try {
file1.transferTo(dest);
System.out.println("上传成功!");
} catch (IOException e) {
e.printStackTrace();
return "error";
}
return "succeess";
}
这串代码的雏形是csdn上某网站抄的,但是有几处不够严谨。
-
没写consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE,导致postan上输入输出格式不好。
-
File dest = new File(filePath, fileName);原来的“,”是加号,“ctrl+左键”点进去后才发现要逗号。
-
异常处理时,要e.printStackTrace();,否则不知道哪里错了。
-
上传地址要这样写:String filePath = "/opt/niuyuanzhuo";。
今天学的小技巧
-
在构建jar包时,输入jar包名,可以通过“tab"键一步输出。
-
若是java -jar jar包名线上运行jar包,可以通过“ctrl+C"退出进程。
-
要看代码哪里出问题,例外报错“error"屁用没有,要打印日志,方式下面链接有。
更加详细的点击链接。
socket构造服务端和客户端,完成数据通信与端的退出
之后,师父让我完成用socket构造服务端和客户端,完成数据通信与端的退出。
还好我很快找到了能满足要求并能大概看懂的代码。代码如下。
先运行server,让服务端已知跑着,再运行客户端,客户端自己关闭,完成信息交互,可以再日志上查看。
师父听完我对代码的讲解后,要求我能在公司ip地址上构建服务器。
之前做的都是http协议上的,是服务层,要写接口 socket走tcp协议,更加原始,不用接口
但是两者都要启动类。网站上没找到socket的启动类,因为他只实现了在本地能触及的ip地址上构建服务端和客户端。
所以我现在大概的思路是在此基础上写启动类,方便我线上运行。