java的图片上传详解

1.场景还原

近期,由于项目需求需要上传图片logo,笔者在探索的过程中遇到过很多坑,今晚就把个人经验分享出来尽量少让博友脑壳疼

2.准备工作

①选择一个专门存储图片的服务器,这里我选择了第三方七牛云存储,真心感觉不错!

②前端与后台采用Ajax交互

3.前端代码

①代码分析

File upload       
upload        function getUpload(){        var formData =newFormData();formData.append('file',$('#file')[0].files[0]);$.ajax({        url:'http://localhost:8080/qiniu/upload',type:'POST',dataType:"json",cache:false,data: formData,processData:false,contentType:false}).done(function(res) {        alert(res.data);document.getElementById("img").src = res.data;}).fail(function(res) {        alert("fail");});}

②重点分析

append()的第二个参数应是文件对象,即$('#file')[0].files[0]。contentType也要设置为‘false’。

从代码$('#file')[0].files[0]中可以看到一个标签能够上传多个文件,只需要在里添加multiple或multiple="multiple"属性。对了这里的dataType一定别忘了写json,不然会解析失败的。

③看效果

4.后台代码

①导入相关依赖

com.google.code.gsongson2.8.0com.squareup.okhttp3okhttp3.6.0com.squareup.okiookio1.11.0com.qiniuqiniu-java-sdk7.1.3commons-iocommons-io2.3commons-fileuploadcommons-fileupload1.2.2

②定义七牛上传图片并返回外链的方法

/*** Created by zhangxing on 2017/6/7.*/public classQiniuUpload {privateStringpicFile;privateStringpicUrl="";publicQiniuUpload(String path){picFile= path;}private static finalStringSPOT="http://om8czer7p.bkt.clouddn.com/";//baseUrl//设置好账号的ACCESS_KEY和SECRET_KEYStringACCESS_KEY="你的ACCESS_KEY";//这两个登录七牛 账号里面可以找到StringSECRET_KEY="你的SECRET_KEY";//要上传的空间Stringbucketname="zhangxing";//填写新建的那个存储空间对象的名称//上传到七牛后保存的文件名Stringkey=newDate().getTime()+".jpg";//上传文件的路径//String FilePath = "E:\\1.jpg";  //本地要上传文件路径//密钥配置Authauth= Auth.create(ACCESS_KEY,SECRET_KEY);//创建上传对象UploadManageruploadManager=newUploadManager();//简单上传,使用默认策略,只需要设置上传的空间名就可以了publicStringgetUpToken(){returnauth.uploadToken(bucketname);}//普通上传publicStringupload()throwsIOException {try{//调用put方法上传Response res =uploadManager.put(picFile,key,getUpToken());//打印返回的信息System.out.println(res.isOK());if(res.isOK()){picUrl=SPOT+key;System.out.println(picUrl);}else{                System.out.println("上传失败!");}                        System.out.println(res.bodyString());}catch(QiniuException e) {            Response r = e.response;System.out.println(r.url());//请求失败时打印的异常的信息System.out.println(r.toString());try{//响应的文本信息System.out.println(r.bodyString());}catch(QiniuException e1) {//ignore}        }returnpicUrl;}  }

记住,这个方法返回的是图片访问的外链。

③配置spring-web

将上述代码原原本本贴在spring-web中

④上传的controller

@RestController@RequestMapping("qiniu")public classQinNiuControllerextendsBaseController {@RequestMapping(value="/upload",method= RequestMethod.POST)publicStringupload(HttpServletResponse response,@RequestParam("file") MultipartFile file)throwsIOException {        response.setHeader("Access-Control-Allow-Origin","*");String fileName=file.getOriginalFilename();File targetFile=newFile("F:\\picture",fileName);if(!targetFile.exists()){            targetFile.mkdirs();}try{            file.transferTo(targetFile);}catch(Exception e){            e.printStackTrace();}          String str =newQiniuUpload(targetFile.getAbsolutePath()).upload();//str得到的是一个七牛返回的外链,然后将str存到自己的服务器returnsuccess(str);}}

⑤BaseController

public classBaseController {protectedLoggerlog= LoggerFactory.getLogger(getClass());protectedLoggerbizErrorLog= LoggerFactory.getLogger("biz_log");private final staticThreadLocalrequest=newThreadLocal();private final staticThreadLocalresponse=newThreadLocal();protected finalIntegerDEFAULT_PAGE_SIZE=20;publicHttpServletRequestreq;publicHttpServletResponseresp;publicHttpSessionsession;@ModelAttributepublic voidreq(HttpServletResponse response,HttpServletRequest request){this.req= request;this.resp= response;this.session= request.getSession();}@SuppressWarnings("static-access")@ModelAttributepublic voidinit(finalHttpServletRequest request,finalHttpServletResponse response) {this.response.set(response);this.request.set(request);}protectedHttpServletRequestgetRequest() {returnrequest.get();}protectedHttpServletResponsegetResponse() {returnresponse.get();}@InitBinderprotected voidinitBinder(finalHttpServletRequest request,finalServletRequestDataBinder binder)throwsException {      binder.addValidators(newParamValidator());}/***获取当前用户*/publicUsergetCurrentUser() {      Authentication auth = SecurityContextHolder.getContext().getAuthentication();if(auth !=null) {        Object principal = auth.getPrincipal();if(principalinstanceofUser) {            User user = (User) principal;if(user !=null&& !user.isAnonymous() ) {returnuser;}        }if(auth.getClass().getSimpleName().indexOf("Anonymous") <0) {log.error("Unknown authentication encountered, ignore it. "+ auth);}      }throw newBizException(GlobalErrorCode.UNAUTHORIZED,"need login first.");}/***成功*/@SuppressWarnings({"rawtypes","unchecked"})publicStringsuccess(Object obj) {      ResponseObject result =newResponseObject();result.setData(obj);String  str = JSON.toJSONString(result);String callback = getRequest().getParameter("callback");if(!SysStringUtils.isEmpty(callback)) {          str = callback+"("+str+")";returnstr;}returnstr;}publicStringchinaToUnicode(String str){          String result="";for(inti =0;i < str.length();i++){intchr1 = str.charAt(i);if(chr1>=19968&&chr1<=171941){//汉字范围\u4e00-\u9fa5 (中文)result+="\\u"+ Integer.toHexString(chr1);}else{                  result+=str.charAt(i);}          }returnresult;}@SuppressWarnings({"rawtypes","unchecked"})publicStringsuccess(Object obj,String score) {      ResponseObject result =newResponseObject();result.setScore(score);result.setData(obj);returnJSON.toJSONString(result);}publicStringconvertToJsonp(String str) {      String callback = getRequest().getParameter("callback");if(!SysStringUtils.isEmpty(callback)) {          str = callback+"("+str+")";returnstr;}returnstr;}@SuppressWarnings({"rawtypes"})publicStringsuccess() {      ResponseObject result =newResponseObject();returnJSON.toJSONString(result,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNonStringKeyAsString);}@SuppressWarnings({"rawtypes"})publicStringfail() {      ResponseObject result =newResponseObject();returnJSON.toJSONString(result);}/***参数不正确*/@SuppressWarnings({"rawtypes"})publicStringargumentError(String msg) {      ResponseObject result =newResponseObject(GlobalErrorCode.INVALID_ARGUMENT);result.setMoreInfo(msg);returnJSON.toJSONString(result);}/***逻辑错误*/publicStringerror(String msg) {throw newBizException(GlobalErrorCode.UNKNOWN,msg);}}

好了,走完整个流程看上传效果:

好了,七牛的图片外链就拿到了,然后记得存一把数据库。

csdn博客链接:http://blog.csdn.net/zhangxing52077/article/details/72935171

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,490评论 18 139
  • 01.{ 换行: Opening Brace Can't Be Placed on a Separate Lin...
    码农不器阅读 2,391评论 0 14
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,493评论 18 399
  • 大多时候我在想我那么美,为什么不让世界看看,借用一句古诗:“最是人间留不住,朱颜辞镜花辞树。” 我呢自我感觉这句诗...
    苏合L阅读 877评论 1 2
  • 为何我就是得不到朋友。 为什么要这样?他们为什么总是迟到?是因为不喜欢我吗?
    皮卡丘_2183阅读 80评论 0 0