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);
}



  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: dispatcherservlet是Spring MVC框架的核心组件之一,负责接收所有的客户端请求,并将其分发给相应的处理器方法进行处理。 首先,dispatcherservlet作为一个前端控制器,接收到所有的请求,并根据请求的URL将其映射到具体的处理器方法上。它通过HandlerMapping来完成URL到方法的映射,可以根据不同的URL配置不同的映射规则。 其次,dispatcherservlet将请求分发给对应的处理器方法进行处理处理器方法是真正执行业务逻辑的地方,它们是由@Controller注解标记的方法。在处理器方法,可以获取客户端传递过来的参数,并根据业务需求处理这些参数。处理器方法还可以返回相应的结果,例如将数据模型返回给视图进行渲染。 最后,dispatcherservlet将处理结果返回给客户端。它通过ViewResolver来找到对应的视图,将数据模型传递给视图进行渲染,并将渲染后的内容返回给客户端。视图可以是HTML页面、JSON数据等多种形式,根据业务需求进行配置。 总之,dispatcherservlet在Spring MVC框架起到了非常重要的作用。它负责接收客户端请求,并将请求分发给对应的处理器方法进行处理。通过配置不同的映射规则和视图解析器,我们可以实现灵活的请求处理和响应结果的渲染。通过学习和理解dispatcherservlet的工作原理,可以更好地使用和理解Spring MVC框架。 ### 回答2: Spring MVC是一个基于Java的Web应用开发框架,其的DispatchServlet是Spring MVC的核心组件之一。DispatchServlet是一个Servlet类,用于接收HTTP请求并将其分发给不同的Controller进行处理。 在Spring MVC,DispatchServlet是由Web容器(例如Tomcat)加载并初始化的。当客户端发送HTTP请求时,Web容器将请求发送到DispatchServlet,DispatchServlet通过URL映射来确定将请求分发给哪一个Controller进行处理。URL映射是通过配置文件或注解来实现的,可以根据请求的URL路径、请求参数等来进行匹配。 DispatchServlet将请求分发给Controller后,Controller会根据请求的业务逻辑进行处理,并生成相应的响应。在处理请求的过程,Controller可以通过注解来获取请求的参数、请求头等信息,并进行相应的处理处理完成后,Controller会返回一个ModelAndView对象,其包含了响应的数据和视图名。 DispatchServlet在接收到Controller返回的ModelAndView后,会将数据传递给ViewResolver来解析视图名并找到相应的视图模板。ViewResolver负责将响应的数据以及视图模板进行解析和渲染,最终生成一个HTML响应,并将其返回给客户端。 除了处理请求分发和视图解析外,DispatchServlet还负责处理异常和拦截器等功能。当请求处理过程发生异常时,DispatchServlet会将异常信息进行捕获并交给异常处理器进行处理。拦截器可以用于在请求到达Controller之前或之后进行一些预处理或后处理操作,例如登录拦截、权限验证等。 总之,DispatchServlet是Spring MVC框架的核心组件之一,负责接收并分发HTTP请求,处理请求的分发、视图解析、异常处理和拦截等功能,是Spring MVC框架实现Web应用开发的重要部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

上帝De助手

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

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

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

打赏作者

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

抵扣说明:

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

余额充值