java在spring mvc中的图片接收与发送处理

1、作为client发送和获取图片

1.1、发送图片

作为client时发送图片通常是通过from-data的multipart形式来发送的,这时我们就在模拟浏览器的form文件表单来提交请求,multipart形式的form表单内容一般如下清单:
<form method="post"action="your/request/url" enctype=”multipart/form-data”>
	<input type="file" name="pic">
	<input type="submit" value="submit">
 </form>
对于这样的一个表单,当用户在点击submit时浏览器就会自动的组装一个multipart形式的POST请求,具体的请求体内容可以参见这篇文章 http://blog.csdn.net/five3/article/details/7181521
 
那么在java里面我们怎么模拟multipart的from表单呢?
最原始的方法就是按照其协议形式我们自己来拼接一个请求的body来,并设置好相应的header头信息(当然就是有点费劲);另外一种方法就是调用java库中即有的Lib库文件(当然也是我们最推荐的)。
这里我们介绍的就是使用java的MultipartEntityBuilder类来实现向服务器端发送一个图片或者文件,具体的代码见如下清单:
String url = "http://your.server.com/postimage/service"
HttpPost httpPost = new HttpPost(url)


HttpParams httpParameters = new BasicHttpParams();
httpParameters.setParameter("charset", HTTP.UTF_8);
HttpConnectionParams.setConnectionTimeout(httpParameters, Integer.parseInt(CONNECTTIMEOUT));
HttpConnectionParams.setSoTimeout(httpParameters, Integer.parseInt(ReadTIMEOUT));


HttpClient httpClient = new DefaultHttpClient(httpParameters);


MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.setCharset(Charset.forName(HTTP.UTF_8));
builder.addTextBody("uid", appKey, ContentType.create("text/plain", Charset.forName(HTTP.UTF_8)));


File image_file = new File("/path/image/file");
FileInputStream fis = new FileInputStream(image_file);
byte[] buf = new byte[(int) file.length()];
fis.read(buf);
fis.close();
builder.addBinaryBody("image_file", buf, ContentType.create(image_file.getContentType()), "image1.jpg");


HttpEntity httpEntity = builder.build();									
httpPost.setEntity(httpEntity);
httpResponse = httpClient.execute(httpPost);


int statusCode = httpResponse.getStatusLine().getStatusCode();


InputStream inStream = httpResponse.getEntity().getContent();
ByteArrayOutputStream body = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len = -1;
while ((len = inStream.read(buf)) != -1) {
	body.write(buf, 0, len);
}
String res = new String(body.toByteArray(), HTTP.UTF_8);

1.2、获取图片

java从服务器端获取图片主要是通过请求图片对应的HTTP的url,然后下载图片到本地,保存到指定位置。具体的代码见清单

String url = "http://path.to.image/file"
String fullName = "/path/to/save/image";
File targetFile = new File(fullName);
int connectionTimeout = 10000;
int readTimeout = 15000;
FileUtils.copyURLToFile(new URL(url), targetFile, connectionTimeout, readTimeout);


2、作为server发送和接收图片

2.1、作为server发送图片

spring MVC回显图片可以直接通过静态资源的url来访问,但是有些情况下我们不希望访问图片的静态资源路径被外人知道,这样就会很容易的被别人进行抓取,因为我们可能会单独写一个controller来处理关于图片的请求,接收到一个与图片对应的密文之后,通过查询DB或者解密的方式获取明文路径,然后读取图片的二进制流在回显给client,此时的图片url请求可能是这样的。
http://your.server.com/image/downloader?sid=d2jssh3sissndnxi3i44k3n
通过这样的url作为回显图片的地址,别人就不能拿来利用进行图片抓取和安全攻击了。这里主要讲的就是通过controller如何向客户端进行图片的回显,具体的代码见清单。
//TODO:根据sid获取实际的图片路径
File file=new File(filePath);
if(!file.exists()){
	logger.error("resource file not exists.");
	return null;
}
try{
	FileInputStream fis = new FileInputStream(file);
	byte[] buf = new byte[(int) file.length()];
	fis.read(buf);
	fis.close();
	
	String fileType = new MimetypesFileTypeMap().getContentType(f);
	res.setContentType(fileType);
	res.setContentLength(fileByte.length);
	
	ServletOutputStream writer = res.getOutputStream();
	writer.write(fileByte);
	writer.flush();
}catch (IOException e) {
	e.printStackTrace();
	logger.error("Error occurs while read resource file.", e);
	return null;
}

2.2、接收图片

在spring mvc中获取请求发送过来的图片并存储,主要通过MultipartFile对象来接收,通过该对象我们可以直接获取到与图片相关的一些信息;比如:图片的二进制流,图片的大小,原始名称,content-type等等,因此当我们拿到这个对象之后就可以直接进行相关保存操作即可。具体的清单见下:
public UploadFile getUploadFile(MultipartFile file, String path) {
	if (!file.isEmpty()) {
		try{
			String fullName = this.getFileStoragePath(path, file.getContentType());
			BufferedOutputStream out = new BufferedOutputStream(
					new FileOutputStream(new File(fullName)));
			out.write(file.getBytes());
			out.flush();
			out.close();


			String encryptPath = SecurityUtils.encryptByAES(fullName);
			
			UploadFile targetFile = new UploadFile();
			targetFile.setName(file.getOriginalFilename());
			targetFile.setSize(file.getSize());
			targetFile.setExtension(file.getContentType().replaceAll(IMAGE_CONTENT_TYPE_PREFIX, ""));
			targetFile.setPath(fullName);
			targetFile.setEncryptPath(encryptPath);
			return targetFile;
		} catch (Exception e) {
			logger.error("Error occurs while save upload file.", e);
			return null;
		}
	} else {
		logger.error("no image received");
		return null;
	}
}


private String getFileStoragePath(String path, String contentType){
	String separator = File.separator;
	String suffix = "png|jpe?g|bmp";
	Pattern r = Pattern.compile(suffix);
	Matcher m = r.matcher(contentType);
	if(StringUtils.isBlank(contentType) || !contentType.startsWith("image/") || !m.find()) {
		logger.error("not support type for file upload");
		return null;
	}
	java.io.File f = new File(path);
	if (!f.exists()){
		f.mkdirs();
	}


	String fileName = String.format("%s.%s", System.currentTimeMillis(), contentType.replace("image/", ""));
	return String.format("%s%s%s", path, separator, fileName);
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上帝De助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值