我们在开发的时候经常遇到一个场景,在修改一个对象信息的时候,会让图片上传上去,并加显。比如个人信息的头像上传,品牌信息的图片上传
分析:
1. 这种场景下我们经常会使用ajax异步传输的方式来实现这个功能。
2. 我们这里使用的是基于springmvc开发的。所有需要给springmvc进行配置.(添加一个接收文件的配置文件,搭建环境这里不提)。
3.当图片较多的时候,需要用到fastDFS专门设置一个图片服务器
第一步:导入jquery.form.js
<script src="/js/jquery.form.js" type="text/javascript"></script>
第二步:编辑前端页面
<!--表单--> <form id="jvForm" > <input type="file" name="pic" onchange="uploadPic()"/> </form>
<!--js-->
<script type="text/javascript">
function uploadPic(){
var option={
url:"/upload/uploadPic.do", <!--提交到后台的地址,让controller接收-->
type:"POST",
dataType:"json", <!--注意这里dataType:"json" 中的json不能是大写的 要不不识别,返回的json字符串,小写的返回json对象-->
success:function(data){
alert(data); //返回的是 Object object为json对象 否则为json字符串
// 图片回显
$("#allUrl").attr("src",data.allUrl);
}
}
$("#jvForm").ajaxSubmit(option);
}
</script>
第三步:在后台spring配置文件上传解析器
<!-- 配置上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver> <property name="maxUploadSize" value="5242880"></property> </bean>
第四步:后台处理
@RequestMapping("/upload")
public class UploadController {
@Resource
private UploadService uploadService;
@SuppressWarnings("deprecation")
@RequestMapping("/uploadPic.do")
public void uploadPic(MultipartFile pic,HttpServletRequest
request,HttpServletResponse response) throws Exception{
<!--形参上的pic必须和前台页面的传递的<input>标签的name中的值一样-->
<!--这里是调用方法保存图片-->
String path=uploadService.uploadPic(pic.getBytes(), pic.getOriginalFilename());
//图片回显
String allUrl=XinbabaConstants.IMG_URL+path;
JSONObject jsonObject=new JSONObject();
jsonObject.put("allUrl", allUrl); //图片完整url
jsonObject.put("imgUrl", path); //图片部分URL
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(jsonObject.toString());
}
}
说明:将json对象返回,在前台通过j操作将值图片地址添加到<img>标签中 至此图片就算回显完成,下面的操作就是将图片添加到服务器中,也就是说的保存图片
第五步:保存图片到fastDFS服务器上
service层
/** * 附件上传至FastDFS */ @Override public String uploadPic(byte[] file_buff, String filename) throws Exception { <!--调用fastDFS工具完成图片上传 file_fuff是文件的字节数组,finame 文件的直实名称--> String path = FastDFSUtil.uploadPicToFDFS(file_buff, filename); return path; //返回图片的路径 }
- 编写fastUtls工具类
-
public class FastDFSUtil { public static String uploadPicToFDFS(byte[] file_buff,String filename) throws Exception{ //1.创建classPathResouce对象,用于加载配置文件 ClassPathResource resource = new ClassPathResource("fdfs_client.conf"); //2.初始化配置文件 ClientGlobal.init(resource.getClassLoader().getResource("fdfs_client.conf").getPath()); //3.获取跟踪服务器的客户端 TrackerClient trackerClient = new TrackerClient(); //4.通过跟踪服务器的客户端获取服务端 TrackerServer trackerServer = trackerClient.getConnection(); //5通过跟踪服务器的服务端获取存储服务器的客户端 StorageClient1 storageClient1 = new StorageClient1(trackerServer,null); //6.将附件上传至FastDFS String file_ext_name=FilenameUtils.getExtension(filename); String path=storageClient1.upload_file1(file_buff, file_ext_name, null); return path; } }
到此就完了,这只是一个初步fastDFS的用法,他到底有什么深入的功能还不是很懂,还有待研究,希望能同学能给够能予帮助提出
- 前端使用jquery.form 是jquery提供的是一个很好用的js插件。更多使用可以查看官网或者其他的网站。
