接口需求是Android/iPhone需要通过接口上传一些文件,例如图片,jar包,rar压缩包,视频,音乐...等!困扰我这个菜鸟很久,整理一下!!分享给同我一样的菜鸟
后台需要处理这些数据,之前没有接触过!但类似的FileUpLoad的插件用过,其实原理差不多,因为计算机原始数据都是01代码,所以只要将这些文件保存成二进制就可以,数据库(mysql),最大4G!!
问题1,如果实现!联调之后共享代码.
问题2,为什么要转为2进制,不直接把上传的文件放在服务器上!
我也请教了别人,首先放在服务器上会很乱,不方便维护!管理不方便,优点当然是不占用数据库资源了(很多时候软件的瓶颈就是数据库的优化).
至于2进制,当然放在数据库里很方便维护,管理!移植,都只需要SQL语句都可以完成,但有个重点是性能问题(内存的占用),如果使用Hibernate的话,需要用懒加载,这样可以保证性能不会很操蛋.
select * from table where id=1
from table where id=1
貌似两个功能是一样的,但是用了懒加载第二个也许在加载数据更快,至于为什么去了解一下懒加载吧!!
问题3,如何选择呢!
如果经常需要访问这个资源,那就直接用文件的形式,缓存资源!!如果不是经常使用可以用二进制.如果你有不同看法,请赐教!!
代码实现!整理中...
public static void main(String[] args) throws Exception { /** * 将字符串转换为二进制 */ String str1 = "我是赵昌文"; //需要转换的字符串 byte[] bys = str1.getBytes("UTF-8"); //将字符串转换为byte数组(GBK...等) //用来保存UTF-8的byte数据 StringBuffer sb = new StringBuffer(); //用来保存二进制 StringBuffer sb1 = new StringBuffer(); //遍历byte的数据(跟转换无关) for(int j=0;j<bys.length;j++){ //(j+1)这样在第二次循环j从1开始,j本身不参与("运算"---字符串拼接),可以写j+1试试 //System.out.println("byte(UTF-8)第"+(j+1)+"个"+bys[j]+"转为二进制"+Integer.toBinaryString(bys[j])); sb.append(bys[j]+","); sb1.append(Integer.toBinaryString(bys[j])+","); } /** * 将二进制转换回字符串 */ System.out.println("UTF-8:"+sb); System.out.println("二进制:"+sb1); // byte[] b = {-26,-120,-111}; // System.out.println("转换回来!!"+new String(b,"UTF-8")); }
上面是自己写的一些转换,下边是上传!!
//提交资源保存 @RequestMapping("/saveResource.aa") public ModelAndView saveResource(@RequestParam("fileParameter") MultipartFile file){ map = new HashMap(); //为false时文件不为空 if(file.getName()!=null&&file.isEmpty()==false){ ResourceImg resource = new ResourceImg(); try { resource.setBody(Hibernate.createBlob(file.getBytes())); resource.setMimeType(file.getContentType()); resource.setName(file.getName()); map.put("result",rm.saveResource(resource)); } catch (IOException e) { e.printStackTrace(); } return new ModelAndView("jsonView",map); }else{ map.put("result","null"); return new ModelAndView("jsonView",map); } }
保存图片
//将图片存到服务器 @RequestMapping("/imageUpload.aa") public String processImageUpload(@RequestParam("fileParameter") MultipartFile image) throws IOException { FileCopyUtils.copy(image.getBytes(),new File("d:/"+image.getOriginalFilename())); return "imageList"; }