JFinal2.0 OreillyCos.setFileRenamePolicy(...) 支持自定义上传文件重名时的更名策略之疑问

Jobsz 发布于 2015/06/19 08:18
阅读 1K+
收藏 0

@JFinal , 非常高兴2.0的发布。看到了很多的新特性。但是对里面的一些新特性有疑问,如题之OreillyCos.setFileRenamePolicy(...) 支持自定义上传文件重名时的更名策略疑问。

UploadFile uploadFile = new UploadFile(name, saveDirectory, filesystemName, originalFileName, contentType);

在MultipartRequest中,有上面的code,saveDirectory是jfinal设置的一个dir,比如/var/upload。 那么我现在有一个fileRenamePolicy按照时间日期来分割目录,就会出现这样的情况,/var/upload/2015/6/19/aaa.jpg。针对这样的情况,在controller里面在getFile的时候,如果需要获取对应的path,那么只能得到/var/upload/aaa.jpg,可想而知,这样子的数据是肯定拿不到aaa.jpg的。

另,比较奇怪为什么去除了spring  Plugin? 

thanks

加载中
1
Jobsz
Jobsz

我这里给几个我之前写的 filerenamepolicy

/**
 * 
 */
package com.jfinal.upload;

import java.io.File;

import com.jfinal.ext.kit.DateTimeKit;
import com.jfinal.ext.kit.RandomKit;

/**
 * @author BruceZCQ
 */
public class DateRandomFileRenamePolicy extends FileRenamePolicyWrapper {

	@Override
	public File nameProcess(File f, String name, String ext) {
		String rename = RandomKit.randomMD5Str();
		String path = f.getParent();
		if (!path.endsWith("/")) {
			path += "/";
		}
		//add year month day
		path += DateTimeKit.formatNowToStyle("yyyy/M/d");
		File file = new File(path);
		if (!file.exists()) {
			file.mkdirs();
		}
		this.setSaveDirectory(path);
		return (new File(path,rename+ext));
	}

}


/**
 * 
 */
package com.jfinal.upload;

import java.io.File;
import java.io.IOException;

import com.oreilly.servlet.multipart.FileRenamePolicy;

/**
 * @author BruceZCQ
 *
 */
public abstract class FileRenamePolicyWrapper implements FileRenamePolicy {
	private String saveDirectory;
	@Override
	public File rename(File f) {
		if (null == f) {
			return null;
		}
		String name = f.getName();
		 String body = "";
		String ext = "";
		int dot = name.lastIndexOf(".");
		if (dot != -1) {
			body = name.substring(0, dot);
			ext = name.substring(dot);
		 }
		return this.nameProcess(f,body, ext);
	}
	/**
	 * 文件名字处理
	 * @param f 文件
	 * @param name 原名称
	 * @param ext 文件扩展名
	 * @return
	 */
	public abstract File nameProcess(File f, String name, String ext);
	protected boolean createNewFile(File f) {
		try {
			return f.createNewFile();
		} catch (IOException ignored) {
		}
		return false;
	}
	public String getSaveDirectory() {
		return saveDirectory;
	}
	public void setSaveDirectory(String saveDirectory) {
		this.saveDirectory = saveDirectory;
	}
}
/**
 * 
 */
package com.jfinal.upload;

import java.io.File;

import com.jfinal.ext.kit.RandomKit;


/**
 * @author BruceZCQ
 * 随机文件名
 */
public class RandomFileRenamePolicy extends FileRenamePolicyWrapper {

	@Override
	public File nameProcess(File f, String name, String ext) {
		String path = f.getParent();
		this.setSaveDirectory(path);
		return (new File(path,RandomKit.randomMD5Str()+ext));
	}
}


MultipartRequest中改成这样:
private void wrapMultipartRequest(HttpServletRequest request, String saveDirectory, int maxPostSize, String encoding, FileRenamePolicy fileRenamePolicy) {
		if (! isMultipartSupported)
			throw new RuntimeException("Oreilly cos.jar is not found, Multipart post can not be supported.");
		
		saveDirectory = handleSaveDirectory(saveDirectory);
		
		File dir = new File(saveDirectory);
		if ( !dir.exists()) {
			if (!dir.mkdirs()) {
				throw new RuntimeException("Directory " + saveDirectory + " not exists and can not create directory.");
			}
		}
		
//		String content_type = request.getContentType();
//        if (content_type == null || content_type.indexOf("multipart/form-data") == -1) {
//        	throw new RuntimeException("Not multipart request, enctype=\"multipart/form-data\" is not found of form.");
//        }
		
        uploadFiles = new ArrayList<UploadFile>();
		
		try {
			if (null == fileRenamePolicy) {
				fileRenamePolicy = new DefaultFileRenamePolicy();
			}
			
			multipartRequest = new  com.oreilly.servlet.MultipartRequest(request, saveDirectory, maxPostSize, encoding, fileRenamePolicy); 
 String saveDirectoryPath = saveDirectory;
			// 使用了FileRenamePolicyWrapper,获取新的saveDirectory
			if (fileRenamePolicy instanceof FileRenamePolicyWrapper){
				saveDirectoryPath = ((FileRenamePolicyWrapper)fileRenamePolicy).getSaveDirectory();
			}
           Enumeration files = multipartRequest.getFileNames();
			while (files.hasMoreElements()) {
				String name = (String)files.nextElement();
				String filesystemName = multipartRequest.getFilesystemName(name);
				
				// 文件没有上传则不生成 UploadFile, 这与 cos的解决方案不一样
				if (filesystemName != null) {
					String originalFileName = multipartRequest.getOriginalFileName(name);
					String contentType = multipartRequest.getContentType(name);
					UploadFile uploadFile = new UploadFile(name, saveDirectoryPath, filesystemName, originalFileName, contentType);
					if (isSafeFile(uploadFile))
						uploadFiles.add(uploadFile);
				}
			}
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}




JFinal
JFinal
感谢分享
0
DavidBao
DavidBao
同问为什么移除 了SpringPlugin?
苏文
苏文
貌似是引入了AOP; 但是移除spring ,貌似没有考虑到使用dubbo
0
JFinal
JFinal
     这个接口只是针对于文名的,当文件名重复时才会回调此方法,而上传目录是通过另外的参数或者配置指定好的,不受干扰,如果还希望改目录,在 getFile 时指定目录即可
Jobsz
Jobsz
其实我想的是,是不是可以定义几个fileRenamePolicy,这样子可以根据不一样的规则io
Jobsz
Jobsz
是不是更应该只是把 saveDir作为一个 BaseDir 呢?然后其他的再根据对应的 fileRenamePolicy做处理得到一个 dir,然后文件的 dir 就是 basedir+dir 呢?
Jobsz
Jobsz
我再次看了一下,在 getFile 中传入一个 saveDir 的确可以拿到对应的 dir。那么也就是每一次,我上传之后,处理对应的文件的时候,都需要处理一下 saveDir,因为我希望是时间分割目录的方式。但是这样子似乎就没有了极简了吧!?
0
JFinal
JFinal
      移除 SpringPlugin 是因为 jfinal 2.0 有了业务层 AOP,已经不需要 spring了,如果开发者仍然需要使用,完全可以将 jfinal 1.9 中的三个文件直接拿来用。spring 有很多的 jar 包,如果不去掉 SpringPlugin,jfinal 也需要关注这些个依赖,增添麻烦
返回顶部
顶部