首页 > 北京SEO优化 > 异域美食 > 正文

JFinal增加从内存获取文件二进制数据的方法

2019-04-07作者:

jfinal现有的文件上传,是用jfinal+cos实现,文件先保存到硬盘后,再获取文件的二进制数据。但这种方式在高频率的文件上传请求的场景,对硬盘的IO要求非常高,影响业务的其它处理。下面是本人修改cos,实现的获取文件流的方法,但不优雅,只是实现了功能。希望jfinal作者能提供该功能,并优雅的实现。

1、在com.oreilly.servlet.MultipartRequest中

public MultipartRequest(HttpServletRequest request, String saveDirectory, int maxPostSize, String encoding, FileRenamePolicy policy) throws IOException {
		// Sanity check values
		if (request == null)
			throw new IllegalArgumentException("request cannot be null");
		if (saveDirectory == null)
			throw new IllegalArgumentException("saveDirectory cannot be null");
		if (maxPostSize <= 0) {
			throw new IllegalArgumentException("maxPostSize must be positive");
		}
		if ("#stream#".equals(saveDirectory)) {
			// 把数据流保存为byte[]
			saveStream(request, saveDirectory, maxPostSize, encoding);
		} else {
			// 把数据流保存为File文件
			saveFile(request, saveDirectory, maxPostSize, encoding, policy);
		}
	}

private void saveStream(HttpServletRequest request, String saveDirectory, int maxPostSize, String encoding) throws IOException {

		// Parse the incoming multipart, storing files in the dir provided,
		// and populate the meta objects which describe what we found
		MultipartParser parser = new MultipartParser(request, maxPostSize, true, true, encoding);

		// Some people like to fetch query string parameters from
		// MultipartRequest, so here we make that possible. Thanks to
		// Ben Johnson, ben.johnson@merrillcorp.com, for the idea.
		if (request.getQueryString() != null) {
			// Let HttpUtils create a name->String[] structure
			Hashtable queryParameters = HttpUtils.parseQueryString(request.getQueryString());
			// For our own use, name it a name->Vector structure
			Enumeration queryParameterNames = queryParameters.keys();
			while (queryParameterNames.hasMoreElements()) {
				Object paramName = queryParameterNames.nextElement();
				String[] values = (String[]) queryParameters.get(paramName);
				Vector newValues = new Vector();
				for (int i = 0; i < values.length; i++) {
					newValues.add(values[i]);
				}
				parameters.put(paramName, newValues);
			}
		}

		Part part;
		while ((part = parser.readNextPart()) != null) {
			String name = part.getName();
			if (name == null) {
				throw new IOException("Malformed input: parameter name missing (known Opera 7 bug)");
			}
			if (part.isParam()) {
				// It's a parameter part, add it to the vector of values
				ParamPart paramPart = (ParamPart) part;
				String value = paramPart.getStringValue();
				Vector existingValues = (Vector) parameters.get(name);
				if (existingValues == null) {
					existingValues = new Vector();
					parameters.put(name, existingValues);
				}
				existingValues.addElement(value);
			} else if (part.isFile()) {
				// It's a file part
				FilePart filePart = (FilePart) part;
				String fileName = filePart.getFileName();
				if(fileName == null || fileName.isEmpty()) {
					// The field did not contain a file
					files.put(name, new UploadedFile(null, null, null, null));
					continue;
				}
				
				ByteArrayOutputStream out = new ByteArrayOutputStream();
				try {
					// The part actually contained a file
					filePart.writeTo(out);
					files.put(name, new UploadedFile(saveDirectory, filePart.getFileName(), fileName, filePart.getContentType(), out.toByteArray()));
				} catch (Exception e) {
					files.put(name, new UploadedFile(null, null, null, null));
					e.printStackTrace();
				} finally {
					out.close();
				}
			}
		}
	}

2、在UploadedFile中增加private byte[] data;可传递值

3、在com.jfinal.upload.UploadFile中增加private byte[] data;可传递值

4、在com.jfinal.upload.MultipartRequest中

private void wrapMultipartRequest(HttpServletRequest request, String uploadPath, int maxPostSize, String encoding) {
		if("#stream#".equals(uploadPath)) {
	    	// 把数据流保存为byte[]
			toStream(request, uploadPath, maxPostSize, encoding);
	    } else {
	    	// 把数据流保存为File文件
	    	toFile(request, uploadPath, maxPostSize, encoding);
	    }
	}
	
private void toStream(HttpServletRequest request, String uploadPath, int maxPostSize, String encoding) {
        uploadFiles = new ArrayList<UploadFile>();
		
		try {
			multipartRequest = new  com.oreilly.servlet.MultipartRequest(request, uploadPath, maxPostSize, encoding, fileRenamePolicy);
			Enumeration files = multipartRequest.getFileNames();
			while (files.hasMoreElements()) {
				String name = (String)files.nextElement();
				String filesystemName = multipartRequest.getFilesystemName(name);
				byte[] data = multipartRequest.getByte(name);
				
				// 文件没有上传则不生成 UploadFile, 这与 cos的解决方案不一样
				if (filesystemName != null) {
					String originalFileName = multipartRequest.getOriginalFileName(name);
					String contentType = multipartRequest.getContentType(name);
					UploadFile uploadFile = new UploadFile(name, uploadPath, filesystemName, originalFileName, contentType, data);
					if (isSafeFile(uploadFile)) {
						uploadFiles.add(uploadFile);
					}
				}
			}
//		} catch (com.oreilly.servlet.multipart.ExceededSizeException e) {
//			throw new ExceededSizeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}

5、controller里获取

UploadFile uFile = getFile("file", "#stream#");
uFile.getData();


【源码分享】JFinal俱乐部...

这套UI目前是为JFinal俱乐部项目和JFinal官网新版...

欢迎使用开源的驰骋表单引...

   

JFinal增加从内存获取文件...

jfinal现有的文件上传,是用jfinal+cos实现,文件...

我即将前往一个大家听闻已...

我即将前往一个大家听闻已久但十分陌生地方,待我...

jfinal engine 在启动时从...

思路:在JFinalConfig的实现类中配置插件的启动时...

JFinal &jfinal...

JFinal 离线文档 chm

下载地址:

预览...

请问,JFINAL是使用什么链...

也就是底层使用的是什么进行数据库链接和操作的?<...

jfinal 图片上传问题

问题如下:

前端上传一张base64格式的图片,...

formdata 提交form表单,...

如下图,日志里面已经输出了用户名和密码,但是使...

关于linux平台 jfinal...

代码命令

quartz与jfinal整合存在的...

jfinal与quartz整合时使用数据库存储方式,在启动时...

JFinal3.6文档,离线版

因为本人公司没有外网,所以无法在线访问jfinal官...

JFinal模板开发的一个IT资...

cron4j表达式与使用简介

cron4j是一个轻量级的Java任务调度工具。

引...

jetty server 2019.1 发布

   为了加快启动速度,提升开发体验,早...

JBolt1.6.8发布-JFinal极...

JBolt是专门为JFinal社区开发者定制的Eclipse开发...

Jfinal 3.5+jfinal...

最近在尝试把公司的一些老项目改成 jfinal 版本 遇...

jfinal查数据遇到对象名无...

使用jfinal对接视图时遇到对象名无效问题,sql语句...

jfinal实现热部署需要引入...

jfinal实现热部署需要引入哪些Jar包

北京SEO-上海网站推广优化-天津杭州百度网络排名公司