我们在工作中可能会遇到大文件的上传,如果一次传输,很有可能会遇到 网络、超时各种各样的问题。这里将分片上传和断点续传两种方式介绍一下方案。

一、分片上传

分片上传的原理:前端首先请求接口获取这次上传的uuid,上传的时间等信息返回给前端页面。前端将所要上传文件进行分片,在上传的时候包含 服务器返回给前端的 该次上传的uuid,该篇文件的md5,上传的第几片的的标识,和文件名称等标识。等到上传的片数等于总片数的时候对所有分片进行合并,删除临时分片。

这里由springboot+freemarker 来演示这个原理
(服务端用到工具类和前端用到的 js由于断点续传 同样也用到,在介绍完 断点续传 之后统一贴出来)

1、首先添加配置文件 application.properties(由于断点续传 需要依赖mysql故也将mysql引入)

server.port=8080spring.freemarker.expose-spring-macro-helpers=true
# 是否优先从文件系统加载template,以支持热加载,默认为true
spring.freemarker.prefer-file-system-access=true
# 设定模板的后缀.
spring.freemarker.suffix=.ftl
# 设定模板的加载路径,多个以逗号分隔,默认:
spring.freemarker.template-loader-path=classpath:/templates/
spring.mvc.static-path-pattern=/static/**spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/pingyougou
spring.datasource.username=root
spring.datasource.password=root#配置.xml文件路径
mybatis.config-locations=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:conf/mapper/*Mapper.xml
#配置模型路径
mybatis.type-aliases-package=com.yin.freemakeradd.pojo

2、引入controller类

localhost:8080/upload2/index 第断点上传入口

@Controller
@RequestMapping(value = "/test")
public class IndexController {@GetMapping(value = "/upload/index")public String  index(Model model){return "breakpointBurst";}@GetMapping(value = "/upload2/index")public String  index2(Model model){return "burst";}}

分片上传的具体上传逻辑

@RestController
@RequestMapping(value = "/burst/test")
public class BurstController {private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");private static final String temp_dir = "C:\\Users\\Administrator\\Desktop\\upload";private static final String final_dir = "C:\\Users\\Administrator\\Desktop\\test";/*** 上传文件** @param request* @return* @throws IllegalStateException* @throws IOException*/@RequestMapping(value = "/upload")public Map<String, Object> upload(HttpServletRequest request, @RequestParam(value = "data",required = false) MultipartFile multipartFile) throws IllegalStateException, IOException, Exception {String uuid = request.getParameter("uuid");String fileName = request.getParameter("name");//总大小String size = request.getParameter("size");//总片数int total = Integer.valueOf(request.getParameter("total"));//当前是第几片int index = Integer.valueOf(request.getParameter("index"));//整个文件的md5String fileMd5 = request.getParameter("filemd5"); //文件第一个分片上传的日期(如:20200118)String date = request.getParameter("date"); //分片的md5String md5 = request.getParameter("md5"); //生成上传文件的路径信息,按天生成String savePath = "\\upload" + File.separator + date;String saveDirectory = temp_dir + savePath +File.separator+uuid;//验证路径是否存在,不存在则创建目录File path = new File(saveDirectory);if (!path.exists()) {path.mkdirs();}//文件分片位置//File file = new File(saveDirectory, uuid + "_" + index);multipartFile.transferTo(new File(saveDirectory, uuid + "_" + index));if (path.isDirectory()) {File[] fileArray = path.listFiles();if (fileArray != null) {if (fileArray.length == total) {//分块全部上传完毕,合并String suffix = NameUtil.getExtensionName(fileName);String dir = final_dir + savePath;File newFile = new File(dir, uuid + "." + suffix);File copyDir = new File(dir);if(!copyDir.mkdir()){copyDir.mkdirs();}FileOutputStream outputStream = new FileOutputStream(newFile, true);//文件追加写入byte[] byt = new byte[10 * 1024 * 1024];int len;// FileInputStream temp = null;//分片文件for (int i = 0; i < total; i++) {int j = i + 1;FileInputStream temp  = new FileInputStream(new File(saveDirectory, uuid + "_" + j));while ((len = temp.read(byt)) != -1) {System.out.println("-----" + len);outputStream.write(byt, 0, len);}//关闭流temp.close();}outputStream.close();//删除临时文件FileUtil.deleteFolder( temp_dir+ savePath +File.separator+uuid);}}}HashMap map = new HashMap<>();map.put("fileId", uuid);return map;}/*** 上传文件前获取id和日期(如果是分片上传这一步可以交给前端处理)** @param request* @return* @throws IOException*/@RequestMapping(value = "/isUpload")public Map<String, Object> getUpload(HttpServletRequest request) throws Exception {HashMap<String,Object> map = new HashMap<>();String uuid = UUID.randomUUID().toString();map.put("fileId", uuid);map.put("date", formatter.format(LocalDateTime.now()));return map;}}

分片前端展示:

<!DOCTYPE HTML>
<html>
<head><meta charset="utf-8"><title>HTML5大文件分片上传示例</title><script src="http://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script><script type="text/javascript" src="/static/md5.js"></script><script>var i = -1;var succeed = 0;var databgein;  //开始时间var dataend;    //结束时间var action = false;    //false检验分片是否上传过(默认); true上传文件var page = {init: function () {$("#upload").click(function () {$("#upload").attr('disabled', true)databgein = new Date();var file = $("#file")[0].files[0];  //文件对象isUpload(file);});}};$(function () {page.init();});function isUpload(file) {//构造一个表单,FormData是HTML5新增的var form = new FormData();var r = new FileReader();r.readAsBinaryString(file);$(r).load(function (e) {var bolb = e.target.result;var md5 = hex_md5(bolb);form.append("md5", md5);//Ajax提交$.ajax({url: "http://localhost:8080//burst/test/isUpload",type: "POST",data: form,//异步async: true,       //很重要,告诉jquery不要对form进行处理processData: false,  //很重要,指定为false才能形成正确的Content-TypecontentType: false,  success: function (dataObj) {// var dataObj = eval("("+data+")");var uuid = dataObj.fileId;var date = dataObj.date;//没有上传过文件upload(file, uuid, md5, date);}, error: function (XMLHttpRequest, textStatus, errorThrown) {alert("服务器出错!");}});})}/** file 文件对象* uuid 后端生成的uuid* filemd5 整个文件的md5* date  文件第一个分片上传的日期(如:20170122)*/function upload(file, uuid, filemd5, date) {name = file.name;        //文件名size = file.size;        //总大小var shardSize = 512 * 1024,    //以0.5m为一个分片shardCount = Math.ceil(size / shardSize);  //总片数if (i > shardCount) {i = -1;i = shardCount;} else {i += 1;  //只有在检测分片时,i才去加1; 上传文件时无需加1}//计算每一片的起始与结束位置var start = i * shardSize,end = Math.min(size, start + shardSize);//构造一个表单,FormData是HTML5新增的var form = new FormData();form.append("action", "upload");  //直接上传分片form.append("data", file.slice(start, end));  //slice方法用于切出文件的一部分$("#param").append("action==upload ");form.append("uuid", uuid);form.append("filemd5", filemd5);form.append("date", date);form.append("name", name);form.append("size", size);form.append("total", shardCount);  //总片数form.append("index", i + 1);        //当前是第几片var ssindex = i + 1;$("#param").append("index==" + ssindex + "<br/>");//按大小切割文件段  var data = file.slice(start, end);var r = new FileReader();r.readAsBinaryString(data);$(r).load(function (e) {var bolb = e.target.result;var md5 = hex_md5(bolb);form.append("md5", md5);//Ajax提交$.ajax({url: "http://localhost:8080//burst/test/upload",type: "POST",data: form,async: true,        //异步processData: false,  //很重要,告诉jquery不要对form进行处理contentType: false,  //很重要,指定为false才能形成正确的Content-Typesuccess: function (dataObj) {//var dataObj = eval("("+data+")");var fileuuid = dataObj.fileId;//服务器返回分片是否上传成功//改变界面++succeed;$("#output").text(succeed + " / " + shardCount);if (i + 1 == shardCount) {dataend = new Date();$("#uuid").append(fileuuid);$("#usetime").append(dataend.getTime() - databgein.getTime());$("#upload").attr('disabled', false);} else if (i + 1 < shardCount) {//递归调用                 upload(file, uuid, filemd5, date);} else {i = -1;succeed = 0;$("#upload").attr('disabled', true)databgein = new Date();file = $("#file")[0].files[0];  //文件对象isUpload(file);}}, error: function (XMLHttpRequest, textStatus, errorThrown) {$("#upload").attr('disabled', false);alert("服务器出错!");}});})}</script></head><body><input type="file" id="file"/><button id="upload">上传</button><span id="output" style="font-size:12px">等待</span><span id="usetime" style="font-size:12px;margin-left:20px;">用时</span><span id="uuid" style="font-size:12px;margin-left:20px;">uuid==</span><br/><br/>
<br/>
<br/>
<span id="param" style="font-size:12px;margin-left:20px;">param==</span></body></html>

分片上传每当一次上传失败,都需要重新生成一个上传唯一uuid,全部从头开始上传。但是相对后面断点续传 同样有上传与服务器的交互少了一半,不用依赖数据库的优点。

二、断点续传

断点续传的原理:前端首先请求接口通过上传文件的MD5来获取此次是否上传,如果上传通过md5将上一次的uuid返回给前端。前端将所要上传文件进行分片,在上传的时候包含 服务器返回给前端的 该次上传的uuid,该篇文件的md5,上传的第几片的的标识,首先去检查是否此片是否上传,如果上传,直接跳到下一片的检查。如果没有上传,再上传文件。上传第一片的时候将信息记录到mysql。等上传完毕,将文件信息改为上传成功。删除临时文件夹。
1、由于首先添加配置文件 application.properties和 入口controller已经添加,这里不再继续贴出。

2、上传具体controller

@RestController
@RequestMapping(value = "/breakpointBusrt/test")
public class BreakpointBurstController {@Autowiredprivate FileUploadService fileUploadService;private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");private static final String temp_dir = "C:\\Users\\Administrator\\Desktop\\upload";private static final String final_dir = "C:\\Users\\Administrator\\Desktop\\test";/*** 上传文件** @param request* @return* @throws IllegalStateException* @throws IOException*/@RequestMapping(value = "/upload")public Map<String, Object> upload(HttpServletRequest request, @RequestParam(value = "data",required = false) MultipartFile multipartFile) throws IllegalStateException, IOException, Exception {String action = request.getParameter("action");String uuid = request.getParameter("uuid");String fileName = request.getParameter("name");String size = request.getParameter("size");//总大小int total = Integer.valueOf(request.getParameter("total"));//总片数int index = Integer.valueOf(request.getParameter("index"));//当前是第几片String fileMd5 = request.getParameter("filemd5"); //整个文件的md5String date = request.getParameter("date"); //文件第一个分片上传的日期(如:20170122)String md5 = request.getParameter("md5"); //分片的md5//生成上传文件的路径信息,按天生成String savePath = "\\upload" + File.separator + date;String saveDirectory = temp_dir + savePath +File.separator+uuid;//验证路径是否存在,不存在则创建目录File path = new File(saveDirectory);if (!path.exists()) {path.mkdirs();}//文件分片位置File file = new File(saveDirectory, uuid + "_" + index);//根据action不同执行不同操作. check:校验分片是否上传过; upload:直接上传分片Map<String, Object> map = null;if("check".equals(action)){String md5Str = FileMd5Util.getFileMD5(file);if (md5Str != null && md5Str.length() == 31) {System.out.println("check length =" + md5.length() + " md5Str length" + md5Str.length() + "   " + md5 + " " + md5Str);md5Str = "0" + md5Str;}if (md5Str != null && md5Str.equals(md5)) {//分片已上传过map = new HashMap<>();map.put("flag", "2");map.put("fileId", uuid);map.put("status", true);return map;} else {//分片未上传map = new HashMap<>();map.put("flag", "1");map.put("fileId", uuid);map.put("status", true);return map;}}else if("upload".equals(action)){//分片上传过程中出错,有残余时需删除分块后,重新上传if (file.exists()) {file.delete();}multipartFile.transferTo(new File(saveDirectory, uuid + "_" + index));}if (path.isDirectory()) {File[] fileArray = path.listFiles();if (fileArray != null) {if (fileArray.length == total) {//分块全部上传完毕,合并String suffix = NameUtil.getExtensionName(fileName);String dir = final_dir + savePath;File newFile = new File(dir, uuid + "." + suffix);File copyDir = new File(dir);if(!copyDir.mkdir()){copyDir.mkdirs();}//文件追加写入FileOutputStream outputStream = new FileOutputStream(newFile, true);byte[] byt = new byte[10 * 1024 * 1024];int len;//FileInputStream temp = null;//分片文件for (int i = 0; i < total; i++) {int j = i + 1;FileInputStream temp = new FileInputStream(new File(saveDirectory, uuid + "_" + j));while ((len = temp.read(byt)) != -1) {System.out.println("-----" + len);outputStream.write(byt, 0, len);}//关闭流temp.close();}outputStream.close();//修改FileRes记录为上传成功fileUploadService.updateUploadRecord(fileMd5, FileConstant.FileStatusEnum.UPLOAD_FINSH.getStatus());}else if(index == 1){//文件第一个分片上传时记录到数据库FileUploadRecord fileUploadRecord = new FileUploadRecord();String name = NameUtil.getFileNameNoEx(fileName);if (name.length() > 50) {name = name.substring(0, 50);}String suffix = NameUtil.getExtensionName(fileName);fileUploadRecord.setName(name);fileUploadRecord.setTimeContent(date);fileUploadRecord.setUuid(uuid);fileUploadRecord.setPath(savePath + File.separator + uuid + "." + suffix);fileUploadRecord.setSize(size);fileUploadRecord.setMd5(fileMd5);fileUploadRecord.setStatus(FileConstant.FileStatusEnum.UPLOAD_BEGIN.getStatus());fileUploadService.insertUploadRecord(fileUploadRecord);}}}map = new HashMap<>();map.put("flag", "3");map.put("fileId", uuid);map.put("status", true);return map;}/*** 上传文件前校验** @param request* @return* @throws IOException*/@RequestMapping(value = "/isUpload")public Map<String, Object> isUpload(HttpServletRequest request) throws Exception {String fileMd5 = request.getParameter("md5");FileUploadRecord fileUploadRecord=fileUploadService.findByFileMd5(fileMd5);HashMap<String,Object> map = new HashMap<>();if(Objects.isNull(fileUploadRecord)){//没有上传过文件String uuid = UUID.randomUUID().toString();map.put("flag", "1");map.put("fileId", uuid);map.put("date", formatter.format(LocalDateTime.now()));map.put("status", true);return map;}if(FileConstant.FileStatusEnum.UPLOAD_FINSH.getStatus().equals(fileUploadRecord.getStatus())){//文件上传成功map.put("flag", "3");map.put("fileId", fileUploadRecord.getUuid());map.put("date",fileUploadRecord.getTimeContent());map.put("status", true);return map;}if(FileConstant.FileStatusEnum.UPLOAD_FINSH.getStatus().equals(fileUploadRecord.getStatus())){map.put("flag", "1");map.put("fileId",  fileUploadRecord.getUuid());map.put("date", fileUploadRecord.getTimeContent());map.put("status", true);return map;}//状态不对String uuid = UUID.randomUUID().toString();map.put("flag", "1");map.put("fileId", uuid);map.put("date", formatter.format(LocalDateTime.now()));map.put("status", true);return map;}}

3、上传的前端页面

<!DOCTYPE HTML>
<html>
<head><meta charset="utf-8"><title>HTML5大文件分片上传示例</title><script src="http://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script><script type="text/javascript"  src="/static/md5.js"></script><script>var i = -1;var succeed = 0;var databgein;  //开始时间var dataend;    //结束时间var action=false;    //false检验分片是否上传过(默认); true上传文件var page = {init: function(){$("#upload").click(function(){$("#upload").attr('disabled',true)databgein=new Date();var file = $("#file")[0].files[0];  //文件对象isUpload(file);});}};$(function(){page.init();});function isUpload (file) {//构造一个表单,FormData是HTML5新增的var form = new FormData();var r = new FileReader();r.readAsBinaryString(file);$(r).load(function(e){var bolb = e.target.result;var md5 = hex_md5(bolb);form.append("md5", md5);//Ajax提交$.ajax({url: "http://localhost:8080//breakpointBusrt/test/isUpload",type: "POST",data: form,async: true,        //异步processData: false,  //很重要,告诉jquery不要对form进行处理contentType: false,  //很重要,指定为false才能形成正确的Content-Typesuccess: function(dataObj){// var dataObj = eval("("+data+")");var uuid = dataObj.fileId;var date = dataObj.date;if (dataObj.flag == "1") {//没有上传过文件upload(file,uuid,md5,date);} else if(dataObj.flag == "2") {//已经上传部分upload(file,uuid,md5,date);} else if(dataObj.flag == "3") {//文件已经上传过alert("文件已经上传过,秒传了!!");$("#uuid").append(uuid);}},error: function(XMLHttpRequest, textStatus, errorThrown) {alert("服务器出错!");}});})}/** file 文件对象* uuid 后端生成的uuid* filemd5 整个文件的md5* date  文件第一个分片上传的日期*/function upload (file,uuid,filemd5,date) {name = file.name;        //文件名size = file.size;        //总大小var shardSize = 512 * 1024 ,    //以0.5m为一个分片shardCount = Math.ceil(size / shardSize);  //总片数if (i > shardCount) {i = -1;i = shardCount;} else {if(!action){i += 1;  //只有在检测分片时,i才去加1; 上传文件时无需加1}}//计算每一片的起始与结束位置var start = i * shardSize,end = Math.min(size, start + shardSize);//构造一个表单,FormData是HTML5新增的var form = new FormData();if(!action){form.append("action", "check");  //检测分片是否上传$("#param").append("action==check ");}else{form.append("action", "upload");  //直接上传分片form.append("data", file.slice(start,end));  //slice方法用于切出文件的一部分$("#param").append("action==upload ");}form.append("uuid", uuid);form.append("filemd5", filemd5);form.append("date", date);form.append("name", name);form.append("size", size);form.append("total", shardCount);  //总片数form.append("index", i+1);        //当前是第几片var ssindex = i+1;$("#param").append("index=="+ssindex+"<br/>");//按大小切割文件段  var data = file.slice(start, end);var r = new FileReader();r.readAsBinaryString(data);$(r).load(function(e){var bolb = e.target.result;var md5 = hex_md5(bolb);form.append("md5", md5);//Ajax提交$.ajax({url: "http://localhost:8080//breakpointBusrt/test/upload",type: "POST",data: form,async: true,        //异步processData: false,  //很重要,告诉jquery不要对form进行处理contentType: false,  //很重要,指定为false才能形成正确的Content-Typesuccess: function(dataObj){var fileuuid = dataObj.fileId;var flag = dataObj.flag;//服务器返回该分片是否上传过if(!action){if (flag == "1") {//未上传action = true;} else if(dataObj.flag == "2") {//已上传action = false;++succeed;}//递归调用                 upload(file,uuid,filemd5,date);}else{//服务器返回分片是否上传成功//改变界面++succeed;$("#output").text(succeed + " / " + shardCount);if (i+1 == shardCount) {dataend=new Date();$("#uuid").append(fileuuid);$("#usetime").append(dataend.getTime()-databgein.getTime());$("#upload").attr('disabled',false);} else {//已上传成功,然后检测下一个分片action = false;//递归调用                 upload(file,uuid,filemd5,date);}}},error: function(XMLHttpRequest, textStatus, errorThrown) {$("#upload").attr('disabled',false);alert("服务器出错!");}});})}</script></head><body><input type="file" id="file" /><button id="upload">上传</button><span id="output" style="font-size:12px">等待</span><span id="usetime" style="font-size:12px;margin-left:20px;">用时</span><span id="uuid" style="font-size:12px;margin-left:20px;">uuid==</span><br/><br/>
<br/>
<br/>
<span id="param" style="font-size:12px;margin-left:20px;">param==</span></body></html>

这里用到mybatis,mybatis大家都有用到。这里就仅将使用到建表语句和实体类贴出

DROP TABLE IF EXISTS `upload_file_record`;
CREATE TABLE `upload_file_record`  (`uuid` varchar(50) not null,`name` varchar(50)   not null COMMENT '文件名',`timeContent` varchar(10) not NULL COMMENT 'yyyyMMdd',`c_path` varchar(225) CHARACTER SET utf8 COLLATE utf8_general_ci not NULL COMMENT '文件地址',`c_size` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci not NULL  COMMENT '大小',`file_md5` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci not NULL  COMMENT 'fileMd5',`status`  TINYINT(2)  not NULL  COMMENT '文件上传状态',`createTime` TIMESTAMP   COMMENT '创建时间',PRIMARY KEY (`uuid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

实体类:

package com.yin.freemakeradd.pojo;import com.yin.freemakeradd.utils.NameUtil;import java.io.File;/*** @author yin* @Date 2020/1/17 22:31* @Method*/@Data
public class FileUploadRecord {private String uuid;private String name;private String timeContent;private String path;private String size;private String md5;private Integer status;private String createTime;

附(这里将使用到工具类和md5.js贴出)

1、服务端使用md5生成工具

public class FileMd5Util {public static final String KEY_MD5 = "MD5";public static final String CHARSET_ISO88591 = "ISO-8859-1";/*** Get MD5 of one file:hex string,test OK!** @param file* @return*/public static String getFileMD5(File file) {if (!file.exists() || !file.isFile()) {return null;}MessageDigest digest = null;FileInputStream in = null;byte buffer[] = new byte[1024];int len;try {digest = MessageDigest.getInstance("MD5");in = new FileInputStream(file);while ((len = in.read(buffer, 0, 1024)) != -1) {digest.update(buffer, 0, len);}in.close();} catch (Exception e) {e.printStackTrace();return null;}BigInteger bigInt = new BigInteger(1, digest.digest());return bigInt.toString(16);}/**** Get MD5 of one file!test ok!** @param filepath* @return*/public static String getFileMD5(String filepath) {File file = new File(filepath);return getFileMD5(file);}/*** MD5 encrypt,test ok** @param data* @return byte[]* @throws Exception*/public static byte[] encryptMD5(byte[] data) throws Exception {MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);md5.update(data);return md5.digest();}public static byte[] encryptMD5(String data) throws Exception {return encryptMD5(data.getBytes(CHARSET_ISO88591));}/**** compare two file by Md5** @param file1* @param file2* @return*/public static boolean isSameMd5(File file1,File file2){String md5_1= FileMd5Util.getFileMD5(file1);String md5_2= FileMd5Util.getFileMD5(file2);return md5_1.equals(md5_2);}/**** compare two file by Md5** @param filepath1* @param filepath2* @return*/public static boolean isSameMd5(String filepath1,String filepath2){File file1=new File(filepath1);File file2=new File(filepath2);return isSameMd5(file1, file2);}}

2、文件名生成工具。

public class NameUtil {/*** Java文件操作 获取文件扩展名*/public static String getExtensionName(String filename) {if ((filename != null) && (filename.length() > 0)) {int dot = filename.lastIndexOf('.');if ((dot > -1) && (dot < (filename.length() - 1))) {return filename.substring(dot + 1);}}return filename.toLowerCase();}/*** Java文件操作 获取不带扩展名的文件名*/public static String getFileNameNoEx(String filename) {if ((filename != null) && (filename.length() > 0)) {int dot = filename.lastIndexOf('.');if ((dot > -1) && (dot < (filename.length()))) {return filename.substring(0, dot);}}return filename.toLowerCase();}public static void main(String[] args) {String str = "AAbbbCC.jpg";System.out.println(getExtensionName(str).toLowerCase());System.out.println(getFileNameNoEx(str).toUpperCase());}
}

删除文件工具类

package com.yin.freemakeradd.utils;import java.io.File;public class FileUtil {/*** 删除单个文件* @param   filePath    被删除文件的文件名* @return 文件删除成功返回true,否则返回false*/public static boolean deleteFile(String filePath) {File file = new File(filePath);if (file.isFile() && file.exists()) {return file.delete();}return false;}/*** 删除文件夹以及目录下的文件* @param   filePath 被删除目录的文件路径* @return  目录删除成功返回true,否则返回false*/public static boolean deleteDirectory(String filePath) {boolean flag = false;//如果filePath不以文件分隔符结尾,自动添加文件分隔符if (!filePath.endsWith(File.separator)) {filePath = filePath + File.separator;}File dirFile = new File(filePath);if (!dirFile.exists() || !dirFile.isDirectory()) {return false;}flag = true;File[] files = dirFile.listFiles();//遍历删除文件夹下的所有文件(包括子目录)for (int i = 0; i < files.length; i++) {if (files[i].isFile()) {//删除子文件flag = deleteFile(files[i].getAbsolutePath());if (!flag){break;}} else {//删除子目录flag = deleteDirectory(files[i].getAbsolutePath());if (!flag){break;}}}if (!flag){return false;}//删除当前空目录return dirFile.delete();}/*** 根据路径删除指定的目录或文件,无论存在与否* @param filePath  要删除的目录或文件* @return 删除成功返回 true,否则返回 false。*/public static boolean deleteFolder(String filePath) {File file = new File(filePath);if (!file.exists()) {return false;} else {if (file.isFile()) {// 为文件时调用删除文件方法return deleteFile(filePath);} else {// 为目录时调用删除目录方法return deleteDirectory(filePath);}}}public static void main(String[] args) {deleteFolder("C:\\Users\\Administrator\\Desktop\\upload"+"\\upload" + File.separator + "20200118"+File.separator+"eed4e9e3-52f0-4755-a391-aaba54d606cc");}
}

前端引入md5.js文件

/* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.*//** Configurable variables. You may need to tweak these to be compatible with* the server-side, but the defaults work in most cases.*/
var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      *//** These are the functions you'll usually want to call* They take string arguments and return either hex or base-64 encoded strings*/
function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }/** Perform a simple self-test to see if the VM is working*/
function md5_vm_test()
{return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
}/** Calculate the MD5 of an array of little-endian words, and a bit length*/
function core_md5(x, len)
{/* append padding */x[len >> 5] |= 0x80 << ((len) % 32);x[(((len + 64) >>> 9) << 4) + 14] = len;var a =  1732584193;var b = -271733879;var c = -1732584194;var d =  271733878;for(var i = 0; i < x.length; i += 16){var olda = a;var oldb = b;var oldc = c;var oldd = d;a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);c = md5_ff(c, d, a, b, x[i+10], 17, -42063);b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);a = safe_add(a, olda);b = safe_add(b, oldb);c = safe_add(c, oldc);d = safe_add(d, oldd);}return Array(a, b, c, d);}/** These functions implement the four basic operations the algorithm uses.*/
function md5_cmn(q, a, b, x, s, t)
{return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t)
{return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t)
{return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t)
{return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t)
{return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}/** Calculate the HMAC-MD5, of a key and some data*/
function core_hmac_md5(key, data)
{var bkey = str2binl(key);if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);var ipad = Array(16), opad = Array(16);for(var i = 0; i < 16; i++){ipad[i] = bkey[i] ^ 0x36363636;opad[i] = bkey[i] ^ 0x5C5C5C5C;}var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);return core_md5(opad.concat(hash), 512 + 128);
}/** Add integers, wrapping at 2^32. This uses 16-bit operations internally* to work around bugs in some JS interpreters.*/
function safe_add(x, y)
{var lsw = (x & 0xFFFF) + (y & 0xFFFF);var msw = (x >> 16) + (y >> 16) + (lsw >> 16);return (msw << 16) | (lsw & 0xFFFF);
}/** Bitwise rotate a 32-bit number to the left.*/
function bit_rol(num, cnt)
{return (num << cnt) | (num >>> (32 - cnt));
}/** Convert a string to an array of little-endian words* If chrsz is ASCII, characters >255 have their hi-byte silently ignored.*/
function str2binl(str)
{var bin = Array();var mask = (1 << chrsz) - 1;for(var i = 0; i < str.length * chrsz; i += chrsz)bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);return bin;
}/** Convert an array of little-endian words to a string*/
function binl2str(bin)
{var str = "";var mask = (1 << chrsz) - 1;for(var i = 0; i < bin.length * 32; i += chrsz)str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);return str;
}/** Convert an array of little-endian words to a hex string.*/
function binl2hex(binarray)
{var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";var str = "";for(var i = 0; i < binarray.length * 4; i++){str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);}return str;
}/** Convert an array of little-endian words to a base-64 string*/
function binl2b64(binarray)
{var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var str = "";for(var i = 0; i < binarray.length * 4; i += 3){var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)| (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )|  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);for(var j = 0; j < 4; j++){if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);}}return str;
}
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Opencv之全景拼接

    要求 将给定的如下两张图片合并,产生全景拼接的效果。代码实现过程 1、导入需要的库 import numpy as np import cv22、创建一个类Stitcher Stitcher类中包含五个方法,它们分别是stitch(self, images, ratio=0.75, reprojThresh=4.0,showMatches=False) cv_show(self,name,im…...

    2024/5/4 17:00:41
  2. 串行、并行和并发

    串行、并行和并发并行和并发并发:1.一个处理器。2.逻辑上的同时运行并行:2.多个处理器。2.物理上的同时运行并发:一个咖啡机,交替并行:多个咖啡机并行:真正的“同时”运行,在同一时刻,有多个任务同时执行。(例如,在多核处理器上,有两个线程同时执行同一段代码。)可见,…...

    2024/5/1 17:12:53
  3. PHP中根据二维数组中某个字段实现排序

    想要实现二维数组中根据某个字段排序,一般可以通过数组循环对比的方式实现。这里介绍一种更简单的方法,直接通过PHP函数实现。 array_multisort() :可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。 详细介绍可参考PHP手册:https://www.php.net/…...

    2024/5/4 18:09:46
  4. 九大设计模式总览类图

    ...

    2024/5/4 19:45:13
  5. JavascriptBOM的核心对象window

    Window对象 参考 MDN https://developer.mozilla.org/zh-CN/docs/Web/API/Windowwindow 对象表示一个包含DOM文档的窗口,其 document 属性指向窗口中载入的 DOM文档 。 使用 document.defaultView 属性可以获取指定文档所在窗口。window作为全局变量,代表了脚本正在运行的窗口…...

    2024/3/29 13:32:41
  6. PAT B1015 德才论 (25分)

    宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。” 现给出一批考生的德才分数,请根据司马光的理论给出录取排名。 输入…...

    2024/3/29 7:23:28
  7. mysql进程卡死,navicat无响应?

    查看所有堵塞进程 show processlist; 然后kill id 比如杀第二个 kill 128103...

    2024/3/29 7:23:29
  8. python 学习笔记之手把手讲解如何使用原生的 urllib 发送网络请求

    从零开始搭建服务器零基础入门教程,手把手搭建自己的服务器,部署自己的前后端项目.雪之梦技术驿站9.90去订阅范例教学urllib.urlopen(url[,data[,proxies]]) : https://docs.python.org/2/library/urllib.htmlpython 中默认自带的网络请求的库就是 urlllib 系列了,包括 urllib …...

    2024/3/29 7:23:26
  9. Java web集成Cas单点登录

    一、概述 现在越来越多的系统提供了统一身份的认证-单点登录机制,新的应用只需要集成单点登录即可轻松集成到已有的系统中。这里我们采用Cas3.2.1来进行演示,注:不同版本的配置会有所区别。 二、Java集成Cas单点登录 2.1 拷贝提供的jar 将下载好的cas-client-core-3.2.1.jar…...

    2024/3/29 7:23:25
  10. 高并发(一)通俗易懂解释IO,CPU密集任务及GIL

    高并发优化方法: 流量优化:防盗链处理前端优化:减少HTTP请求,合并css或js,添加异步请求,启用浏览器缓存和文件压缩,CDN加速,建立独立图片服务器,服务端优化:页面静态化,并发处理,队列处理数据库优化:数据库缓存,分库分表,分区操作,读写分离,负载均衡web服务器…...

    2024/4/29 13:16:47
  11. maven概念、配置速记

    基本配置POM:项目对象模型,Project Object Model <modelVersion>表示pom的版本,maven2和maven3中modelVersion只能是4.0.0 mvn archetype:generate快速生成项目,格式为:groupId:artifactId:version:goal <packaging>:打包方式,默认是jar,还有:war、pom、m…...

    2024/3/29 7:23:22
  12. 速读原著-GRUB_多系统引导(GRUB软件包版本选择和安装)

    二、GRUB软件包版本选择和安装; 1、GRUB的版本选择,Linux版本的GRUB及Windows版本的GRUB的说明; GRUB不但有Linux版本,也有Windows版本;现我们一一介绍; 如前面所说,目前在在Unix类的操作系统中,大多是都有GRUB;GRUB几乎能引导所有X86架构的操作系统;功能之强,使用简…...

    2024/3/29 7:23:21
  13. Java集合框架概览

    常见容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。Java 集合框架图 Map 集合框架图 一、CollectionSetTreeSet:基于红黑树实现,支持有序性操作,例如:根据一个范围查找元素的操作。但是查找效率不如 HashS…...

    2024/4/3 20:36:13
  14. C# 编程实现检测USB设备插拔 -- 升级版

    序言:前篇博客的方式有些落伍,现对其进行升级。这种方式更加合理些。写下博客以备忘。希望可以帮助到一些有需要的同道中人!正文:protected: virtual void WndProc(System::Windows::Forms::Message% m) override {try{if (m.Msg == 0x219){if (m.WParam.ToInt32() == 0x07…...

    2024/4/13 7:57:45
  15. zz测试

    ces文章排序ces文章排序ces文章排序ces文章排序cpongo66660.01去订阅对付撒回复士大夫艰苦打开拉萨酱豆腐了解...

    2024/3/29 13:32:39
  16. 《从零开始的记账本开发》第0篇 背景介绍及软件界面

    一、背景本人计算机专业,在刚结束的前一个学期都在大量的编写代码。在那个学期里学习了Android移动开发、JavaWeb开发以及软件工程,再加上之前学习的数据结构、数据库原理与应用、计算机网络、算法设计与分析。具有强烈愿望去尝试开发一款较为完善的软件,当然仅靠课堂上的知…...

    2024/3/29 13:32:38
  17. 正能量语录

    如果你想要变得比别人更强,那你必须比别人更努力,花更多的时间。在别人睡觉时,你在学习;在别人沉溺手机时,你在学习。你要相信,梦想能改变现实 。努力成为一名改变世界的软件工程师,不要放任自己,甘心当一个代码的搬运工。如果你不随波逐流,那么你可能在正轨上。集思广…...

    2024/3/29 13:32:37
  18. 4.1基础知识

    4.1.1 Java 语言有哪些优点具体而言,Java 语言具有以下几个方面的优点:1)Java 为纯面向对象的语言。《Java 编程思想》提到 Java 语言是一种「Everything is ob-ject」的语言,它能够直接反应现实生活中的对象,例如火车、动物等,因此通过它,开发人员编写程序更为容易。2)…...

    2024/4/23 19:55:50
  19. 剑指offer-调整数组顺序使奇数位于偶数前面

    问题描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。源码:一定要注意牛客网得题目和剑指offer的题目不一样,牛客网上还要考虑顺序,我写…...

    2024/3/29 13:32:35
  20. VFIO PassThrough

    VFIO PassThrough 对于VFIO的概述可以参考文章vfio 概述。这里以PCI设备为例讲述VFIO PassThrough具体实现(VFIO不仅仅支持PCI设备)。对于一个透传给虚机的PCI设备,主要处理config空间透传、BAR空间透传和中断三方面,下面分别讲述如何实现这两方面的透传。 1.config空间透传实…...

    2024/3/29 13:32:34

最新文章

  1. 虚拟机网络实现桥接模式

    虚拟机网络实现桥接模式 虚拟化软件&#xff1a;VMware 17 Linux&#xff1a;rocky8_9 主机&#xff1a;Win10 文章目录 虚拟机网络实现桥接模式1. 桥接模式介绍2. 查看Win本机的网络信息&#xff08;以笔记本电脑以WiFi联网为例&#x…...

    2024/5/4 20:15:19
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. jenkins参数化构建

    Jenkins 的参数化构建 Jenkins 是一个开源的持续集成和持续部署工具&#xff0c;它可以帮助开发者自动化构建、测试和部署软件项目。在本文中&#xff0c;我们将重点介绍如何使用 Jenkins 的参数化构建功能来创建更加灵活和可定制的项目。 参数化构建是 Jenkins 提供的一种强…...

    2024/5/3 2:30:22
  4. 【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)

    目录 前言 什么是面向对象&#xff1f; 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象的存储方式 this指针 结语 前言 最早的C版本&#xff08;C with classes&#xff09;中&#xff0c;最先加上的就是类的机制&#xff0c;它构成…...

    2024/5/1 13:18:37
  5. HIS系统是什么?一套前后端分离云HIS系统源码 接口技术RESTful API + WebSocket + WebService

    HIS系统是什么&#xff1f;一套前后端分离云HIS系统源码 接口技术RESTful API WebSocket WebService 医院管理信息系统(全称为Hospital Information System)即HIS系统。 常规模版包括门诊管理、住院管理、药房管理、药库管理、院长查询、电子处方、物资管理、媒体管理等&…...

    2024/5/1 13:22:01
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/3 23:10:03
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/4 18:20:48
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/4 2:59:34
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57