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

java在spring mvc中的图片接收与发送处理相关推荐

  1. Spring 2.5:Spring MVC中的新特性

    转载说明:infoQ就是牛人多,看人家去年就把Spring2.5注视驱动的MVC写出来了,还是这么详细,我真是自叹不如,今天偶尔看到这篇文章非常认真的拜读了2遍,简直是茅厕顿开啊....\(^o^)/ ...

  2. Spring MVC 中的http Caching

    文章目录 过期时间 Last-Modified ETag Spring ETag filter Spring MVC 中的http Caching Cache 是HTTP协议中的一个非常重要的功能,使 ...

  3. spring mvc 异步_DeferredResult – Spring MVC中的异步处理

    spring mvc 异步 DeferredResult是一个可能尚未完成的计算的容器,它将在将来提供. Spring MVC使用它来表示异步计算,并利用Servlet 3.0 AsyncContex ...

  4. DeferredResult – Spring MVC中的异步处理

    DeferredResult是一个可能尚未完成的计算的容器,它将在将来提供. Spring MVC使用它来表示异步计算,并利用Servlet 3.0 AsyncContext异步请求处理. 简要介绍一 ...

  5. Spring mvc中@RequestMapping 6个基本用法小结

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 小结下spring mvc中的@RequestMapping的用法. 1)最基本的,方法级别上应用, ...

  6. Http请求中Content-Type讲解以及在Spring MVC中的应用

    引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 ...

  7. Spring MVC中基于自定义Editor的表单数据处理技巧

    本文出处:http://blog.csdn.net/chaijunkun/article/details/8642642,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  8. [转]Http请求中Content-Type讲解以及在Spring MVC中的应用

    本文转自:http://blog.csdn.net/blueheart20/article/details/45174399 引言: 在Http请求中,我们每天都在使用Content-type来指定不 ...

  9. Spring mvc 中使用 kaptcha 验证码

    2019独角兽企业重金招聘Python工程师标准>>> 生成验证码的方式有很多,个人认为较为灵活方便的是Kaptcha ,他是基于SimpleCaptcha的开源项目.使用Kaptc ...

最新文章

  1. mybatis mysql Druid_mybatis+Druid连接池的问题
  2. java swing图形界面开发与案例详解source code
  3. 深入理解ES6笔记(九)JS的类(class)
  4. jenkins报错Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password) 的处理
  5. java报错怎么看_IGV 哐当就不能用了,除了换台电脑还能怎么办?
  6. 敏捷开发一千零一问系列之五:怎样让队员主动要活?
  7. 数组 / 伪数组 判断及方法调用 (权威指南笔记)
  8. wait()和sleep()区别(常见面试题)
  9. 软考软件设计师中级考试大纲(附题型举例)
  10. 玻尔兹曼机(Boltzmann机)和深度置信网络基本概念
  11. 权限设计,可控制每个接口的使用。
  12. 《那些年啊,那些事——一个程序员的奋斗史》六
  13. android平板和ipad区别,为什么说买平板必须买ipad?那么安卓平板和iPad到底有什么区别?...
  14. Java API在HDFS上实现文件的上传、下载到本地、创建文件夹、删除文件和重命名文件
  15. ElasticSearch学习笔记(八)Java AP实现增删改查
  16. Python调用cmd
  17. 特斯拉、谷歌最可怕的对手!乔治·霍兹(George Hotz)
  18. 3D,小白需要理解的点云概念
  19. spark sql教程_如何使用Spark SQL:动手教程
  20. !function($){}(window.jQuery) 是什么意思

热门文章

  1. php 图片 模糊,Word中插入图片模糊、不清晰的解决方法
  2. GCP认证考试之Storage专题
  3. 2020最新中高阶Android面试题总结-下(附解题思路),8年Android开发教你如何写简历
  4. 优化算法-3:RMSProp算法和Adam算法
  5. 2009-09-神秘东北大哥
  6. java printable_java解析电话薄 VCF文件ENCODING=QUOTED-PRINTABLE编码
  7. 农村家庭暴力有什么应对的措施
  8. web安全所需过滤的特殊字符
  9. moon服务器 zerotier_配置ZeroTier的moon服务器记录
  10. Artifact shell for APAR