},
imgUploadError(err, file, fileList){//图片上传失败调用
console.log(err)
this.$message.error(‘上传图片失败!’);
}
}
}
3.controller
@RequestMapping(value = “/imgUpload”)
public Wrapper imgUpload(HttpServletRequest req, MultipartHttpServletRequest multiReq)
throws IOException {
System.out.println(“—” + fileUploadPath);//我这里用的springboot 在application.properties中配置,使用@Value 获取的文件上传目录
MultipartFile file = multiReq.getFile(“file”);
String originalFilename = file.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.indexOf(“.”));
String localFileName = MD5Util.md5(file.getInputStream()) + suffix;
File localFile = new File(fileUploadPath + localFileName);
if (!localFile.exists()) {
localFile.createNewFile();
FileOutputStream fos = new FileOutputStream(
localFile);
FileInputStream fs = (FileInputStream) multiReq.getFile(“img”).getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fs.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
fs.close();
} else {
log.info(“文件已存在!!”);
}
return WrapMapper.wrap(
Wrapper.SUCCESS_CODE,
Wrapper.SUCCESS_MESSAGE,
“http://localhost:8080/img/” + localFileName);//这里是我执行封装的返回结果,也可以使用map,
}
4.MD5工具类
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
private static char[] Digit = {‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’,
‘9’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’};
public static String getMd5Sum(String inputStr)
throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance(“MD5”);
byte[] inputStrByte = inputStr.getBytes();
digest.update(inputStrByte, 0, inputStrByte.length);
byte[] md5sum = digest.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 16; i++) {
char[] ob = new char[2];
ob[0] = Digit[md5sum[i] >> 4 & 0x0F];
ob[1] = Digit[md5sum[i] & 0x0F];
String s = new String(ob);
sb.append(s);
}
return sb.toString();
}
/**
-
对字符串进行 MD5 加密
-
@param str
-
待加密字符串
-
@return 加密后字符串
*/
public static String md5(String str) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance(“MD5”);
md5.update(str.getBytes(“UTF-8”));
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e.getMessage());
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e.getMessage());
}
byte[] encodedValue = md5.digest();
int j = encodedValue.length;
char finalValue[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte encoded = encodedValue[i];
finalValue[k++] = Digit[encoded >> 4 & 0xf];
finalValue[k++] = Digit[encoded & 0xf];
}
return new String(finalValue);
}
/**
-
签名字符串
-
@param text
-
需要签名的字符串
-
@param sign
-
签名结果
-
@return 签名结果
*/
public static boolean verify(String text, String sign) {
String mysign = md5(text);
if (mysign.equals(sign)) {
return true;
} else {
return false;
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
数据结构与算法
这一块在笔试、面试的代码题中考核较多,其中常考的数据结构主要有:数组、链表、队列、栈、Set、Map、哈希表等,不同数据结构有不同的方法以及储存原理,这些算是技术岗的必备知识。算法部分主要分为两大块,排序算法与一些其他算法题。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
排序算法根据考频高低主要有:快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序、希尔排序、桶排序、基数排序、Timsort这十种,这类考核点要么是算法的时间、空间复杂度、稳定度,要么是直接手写代码,故在理解算法原理的同时,对JS语言版的排序算法代码也要加强记忆。
- 二叉树层序遍历
- B 树的特性,B 树和 B+树的区别
- 尾递归
- 如何写一个大数阶乘?递归的方法会出现什么问题?
- 把多维数组变成一维数组的方法
- 知道的排序算法 说一下冒泡快排的原理
- Heap 排序方法的原理?复杂度?
- 几种常见的排序算法,手写
- 数组的去重,尽可能写出多个方法
- 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
- 知道数据结构里面的常见的数据结构
- 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
- 合并两个有序数组
- 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)
- 知道的排序算法 说一下冒泡快排的原理
- Heap 排序方法的原理?复杂度?
- 几种常见的排序算法,手写
- 数组的去重,尽可能写出多个方法
- 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
- 知道数据结构里面的常见的数据结构
- 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
- 合并两个有序数组
- 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)
[外链图片转存中…(img-MoL5ymKv-1710841089502)]