Java文件名==>修改器

java批量修改文件名

下载了一个系类的优酷《原创精选》发现文件名很恶心,带有各种不要的字段,使文件名变得很长,看不完全

最关键的是:由于顺序强迫症,喜欢按照顺序观看,前面是中文,无法按照文件名排序,中文的后面才是更新日期

我要的格式:130601_智商硬伤混黑道笑惨了.mp4

这样可以按照文件名进行排序,就可以从头开始观看了


于是萌生出写一个工具类来批量重命名一下

于是有了下面的一个工具类RenameFolderUtils.java:

package com.dhh.Utils;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
 * 批量修改文件名工具类
 * 需求:
 * 	当下载很多视频后,视频文件名中总会有很多的不要的字段,比如有文件名中有电影的网址等,高清字段等,
 *  这些有碍于清楚的知道文件内容
 * 	关键是当批量下载很多集视频后,它的播出时间会写在题目的后面140531表示2014.5.31号更新的视频,
 *  如果能将这些放在前面去,视频将变得有顺序,就可以根据日期排序
 * 作用:
 * 	将更新日期提前,去掉文件名中碍眼的字段
 * @author dhh
 *
 */
public class RenameFolderUtils {
	public String srcPath;
	
	public static void main(String[] args) {
		//可以根据自己的需求来修改
		String srcPath = "F:\\Youku Files\\download";   //原路径
		String destPath = null;                                     //目标路径
		Map<String, String> condition = new HashMap<String, String>(); 
		//组拼条件
		condition.put("_","");      //去掉下划线
		condition.put("-", "");     //去掉中划线
		condition.put("高清", "");  //去掉"_高清"
		condition.put(" ", "");     //去掉空格
		String decoration = "_";    //数字和字符以下划线相隔
		boolean isFirstDecided = false;  //位数相同以后面为准
		boolean isDeep = true;           //是否深度扫描
		renameFolder(srcPath, destPath ,condition, 
				decoration, isFirstDecided, isDeep);
	}
	
	
	/**
	 * 批量修改文件名的主要工具类
	 * 注意:路径名最后一律不带\\,程序会自动添加上去
	 * @param srcPath 
	 *  原路径(要重命名的文件夹路径),如果是具体文件路径,则只修改这个文件,字段不能为NULL或者"",
	 * @param destPath 
	 *  目标路径(修改后存在的路径)如果为NULL或者""值,则代表修改后存放在原来的路径
	 * @param condition 
	 *  条件值HashMap<String,String>,HashMap第一个表示文件名中不想要的名字,
	 *  第二个值表示要替换的值,如果只想把第一个值删除,那么第二个参数填"",采用的是replace方法
	 * @param decoration 
	 *  修饰附,数字与字符之间的相隔符号,一般用下划线_
	 * @param isFirstDecided 
	 *  算法要实现将原来文件名的数字提到前面去,首先按照位数来判定,位数长的放在最前面,当位数相同时要采取哪种策略,
	 *  由该参数来决定,true表示当位数相同时,由前面的数字决定,false表示由后面数字决定
	 *  eg.java视频140523传智播客140623.avi 这个文件名如果填true,则为
	 *  140523java视频传智播客140623.avi,否则为:140623java视频140523传智播客140623.avi
	 * @param isDeap
	 *  是否要深度扫描,即表示文件夹中的文件夹是否也要修改,true表示深度扫描,
	 *  false表示只扫描原路径中所有文件,原路径中的文件夹不管
	 */
	public static void renameFolder(String srcPath,String destPath,
			Map<String, String> condition,String decoration,
			boolean isFirstDecided,boolean isDeap){
		try {
			File file = new File(srcPath);
			if(file.exists() && file.isDirectory()){
				File[] files = file.listFiles();
				if(files.length>0){    //里面有文件
					System.out.println("大小为:"+files.length);
					for(File myfile : files){
						String fileAllName = myfile.getName();  //包括后缀
						if(myfile.isFile()){
							//得到所有的文件名,不包括后缀
							String fileName = fileAllName.substring(0,fileAllName.lastIndexOf("."));
							//得到文件的后缀名
							String suffix = fileAllName.substring(fileAllName.lastIndexOf("."),
									fileAllName.length());
							//修改文件名
							String newName = "";
							newName = replaceWord(fileName, condition);  //先替换不要的词
							newName = makeNumFirst(newName,decoration, isFirstDecided);//替换位置
							String realName = "" ;   //新文件的全路径名
							if(destPath!=null && !destPath.equals(""))
							{
								File destFile = new File(destPath); 
								if(!destFile.exists())       //如果目标文件夹不存在的话
									destFile.mkdirs();      //创建这个文件夹
								if(destFile.exists()&&destFile.isFile()){
									System.out.println("目标文件夹不能为一个文件,请重新输入!");
									return;
								}
								realName = destPath + "\\" + newName+suffix ;
							}else{
								realName = srcPath + "\\" + newName+suffix;   
							}
							System.out.println("原来名字为:"+fileAllName);
							System.out.println("新名为:"+newName+suffix);
							System.out.println("==================================");
							//设置新的文件名
							myfile.renameTo(new File(realName));
							System.out.println("批量重命名成功!");
						}else{
							//递归调用,子文件夹中的文件也重命名
							if(isDeap){
								renameFolder(myfile.getAbsolutePath(),destPath ,condition, 
										decoration, isFirstDecided,isDeap);
							}
						}
					}
				}else{
					System.out.println("文件夹为空!");
				}
			}else if(file.exists() && file.isFile()){      //要修改的只是一个文件,而不是文件夹
				String fileAllName = file.getName();  //包括后缀
				//得到所有的文件名,不包括后缀
				String fileName = fileAllName.substring(0,fileAllName.lastIndexOf("."));
				//得到文件的后缀名
				String suffix = fileAllName.substring(fileAllName.lastIndexOf("."),
						fileAllName.length());
				//修改文件名
				String newName = "";
				newName = replaceWord(fileName, condition);  //先替换不要的词
				newName = makeNumFirst(newName,decoration, isFirstDecided);//替换位置
				String realName = "" ;   //新文件的全路径名
				if(destPath!=null && !destPath.equals(""))
				{
					File destFile = new File(destPath); 
					if(!destFile.exists())       //如果目标文件夹不存在的话
						destFile.mkdirs();      //创建这个文件夹
					if(destFile.exists()&&destFile.isFile()){
						System.out.println("目标文件夹不能为一个文件,请重新输入!");
						return;
					}
					realName = destPath + "\\" + newName+suffix ;
				}else{
					realName = srcPath + "\\" + newName+suffix;   
				}
				System.out.println("原来名字为:"+fileAllName);
				System.out.println("新名为:"+newName+suffix);
				System.out.println("==================================");
				//设置新的文件名
				file.renameTo(new File(realName));
				System.out.println("批量重命名成功!");
			}else{
				System.out.println("原路径名不存在!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 按照Map中的条件替换word
	 * @param word 
	 *  要替换的字符串
	 * @param condition 
	 *  条件值HashMap<String,String>,HashMap第一个表示文件名中不想要的名字,
	 *  第二个值表示要替换的值,如果只想把第一个值删除,
	 *  那么第二个参数填"",采用的是replace方法
	 * @return 
	 *  替换后的名字
	 */
	public static String replaceWord(String word,Map<String, String> condition){
		String newWord = "";
		if(condition.size()>0){
			for(Entry<String, String> entry : condition.entrySet()){
				newWord = word.replace(entry.getKey(), entry.getValue());
				word = newWord;
			}
		}
		return newWord;
	}
	
	/**
	 * 将数字放在前面
	 * @param word 
	 *  要处理的字符串
	 * @param decoration 
	 *  数字放在第一后,数字与后面字符之间的间隔符号,一般使用下划线_
	 * @param isFirstDecided 
	 *  算法要实现将原来文件名的数字提到前面去,首先按照位数来判定,位数长的放在最前面,当位数相同时要采取哪种策略,
	 * 	由该参数来决定,true表示当位数相同时,由前面的数字决定,false表示由后面数字决定
	 * @return 
	 *  处理后的字符串
	 */
	public static String makeNumFirst(String word,String decoration,
			boolean isFirstDecided){
		char[] charWords = word.toCharArray();
		StringBuffer strBuff = new StringBuffer();  //用来拼加字符
		String tempMax = new String();   //用来选择出较大的连接数字
		
		for(int i = 0 ;i<charWords.length; i++){
			char charword = charWords[i];
			if((int)charword>=48&&(int)charword<=57){        //选出数字
				strBuff.append(charword);           //拼加数字
				if(i==charWords.length-1){    //如果是最后一个,也要比较
					if(isFirstDecided){
						if(strBuff.length()> tempMax.length()){
							tempMax = strBuff.toString();
						}
					}else{
						if(strBuff.length()>= tempMax.length()){
							tempMax = strBuff.toString();
						}
					}
				}
			}else{
				if(isFirstDecided){
					if(strBuff.length()> tempMax.length()){
						tempMax = strBuff.toString();
					}
				}else{
					if(strBuff.length()>= tempMax.length()){
						tempMax = strBuff.toString();
					}
				}
				strBuff.delete(0, strBuff.length());    //清空strBuff
			}
		}
		if(tempMax.length()==0){        //如果没有数字
			return word;
		}else{
			return tempMax + decoration + word.replace(tempMax, "");
		}
	}
}



<think>好的,我现在需要帮用户解决配置Layui富文本编辑器上传接口的问题,实现自定义路径保存图片并预览,后端存储到临时目录。首先,我得回忆一下Layui富文本编辑器的相关配置。Layui的富文本编辑器通常是使用layedit模块,但上传图片可能需要单独配置上传接口。 用户提到需要修改上传接口以支持自定义路径,后端处理存储到临时文件夹。首先,前端的Layui配置部分,我记得在初始化编辑器时,可以通过设置uploadImage的url来指定后端接口地址。然后,可能需要设置上传的参数名,比如file,以及处理响应结果,确保返回正确的图片路径供预览使用。 然后,后端部分需要接收文件,保存到临时目录。这里需要考虑如何获取上传的文件,使用Spring框架的话,可以用MultipartFile接收。存储路径方面,用户提到了临时目录,可能需要使用System.getProperty("java.io.tmpdir")来获取系统的临时目录路径。同时,要确保目录存在,不存在的话需要创建。 另外,用户之前的问题中提到了引用[1]和[2],关于文件存储路径和虚拟目录映射。引用[1]中的方法是通过ResourceUtils获取项目路径,然后拼接自定义路径。但这里用户想要的是临时目录,所以可能需要调整路径获取方式,不使用项目路径,而是系统临时目录。 引用[2]中提到了配置虚拟目录映射,以便回显图片。用户上传到临时目录后,可能需要通过虚拟路径来访问这些图片,所以后端需要添加资源处理器,将临时目录映射到一个URL路径,比如/tmp/**,这样前端可以通过这个路径访问图片,实现预览。 步骤总结:前端配置Layui的上传接口URL,后端创建对应的接口接收文件,保存到临时目录,返回图片的访问URL,前端预览。同时后端需要配置虚拟目录映射,让图片可以访问。 可能需要注意的点:临时目录的权限问题,确保应用有写入权限;文件名的处理,避免重复;返回的图片URL是否正确拼接了虚拟路径;Layui的响应格式要求,比如code为0表示成功,src为图片路径。 现在需要详细写出前端和后端的代码步骤,确保用户能按照指导一步步配置。同时,根据用户提供的引用,可能需要结合项目路径或系统临时路径,这里用户明确要求临时目录,所以后端存储路径应使用系统临时目录,并通过虚拟映射提供访问。</think>### 分步解决方案 #### 1. 前端Layui富文本编辑器配置 ```javascript layui.use('layedit', function(){ var layedit = layui.layedit; // 初始化编辑器时配置上传接口 layedit.build('editor', { uploadImage: { url: '/upload/image', // 后端接口地址 type: 'post', // 请求方式 field: 'file', // 上传文件参数名 done: function(res){ if (res.code == 0) { // 上传成功判断 return res.data.url; // 返回图片访问路径 } } } }); }); ``` #### 2. 后端接口实现(Spring Boot示例) ```java @RestController public class UploadController { // 配置临时存储路径(系统临时目录+自定义子目录) private final Path tmpPath = Paths.get(System.getProperty("java.io.tmpdir"), "layui_uploads"); @PostMapping("/upload/image") public Map<String, Object> upload(@RequestParam("file") MultipartFile file) throws IOException { // 自动创建目录(如果不存在) if (!Files.exists(tmpPath)) { Files.createDirectories(tmpPath); } // 生成唯一文件名 String fileName = UUID.randomUUID() + "_" + file.getOriginalFilename(); Path targetPath = tmpPath.resolve(fileName); // 保存文件到临时目录 file.transferTo(targetPath); // 返回虚拟访问路径(需配合虚拟目录映射) return new HashMap<String, Object>(){{ put("code", 0); put("data", new HashMap<String, String>(){{ put("url", "/tmp/" + fileName); // 对应虚拟路径映射 }}); }}; } } ``` #### 3. 配置虚拟目录映射(实现文件预览) ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 映射临时目录到虚拟路径 registry.addResourceHandler("/tmp/**") .addResourceLocations("file:" + System.getProperty("java.io.tmpdir") + "/layui_uploads/"); } } ``` #### 关键点说明: 1. **前端适配**:通过`uploadImage`配置项指定上传接口,响应需包含`code`和`data.url`字段[^1] 2. **路径管理**:使用系统临时目录`java.io.tmpdir`保证跨平台兼容性,自动创建多层目录结构[^4] 3. **文件命名**:采用UUID+原始文件名避免重复,防止覆盖 4. **安全存储**:临时目录自动清理机制需结合系统任务配置 5. **预览实现**:通过虚拟路径映射将物理存储路径转换为可访问URL[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值