Java Servlet+Objective-c图上传 步骤详细
一、 Servlet
1.创建图片保存的路径
在项目的WebContent下创建一个上传图片的专属文件夹。
这个文件夹创建后,我们保存的图片就在该文件夹的真实路径下,但是在项目中是无法看到上传的图片的,访问此文件夹下的图片,使用项目的baseurl+图片文件夹+图片名称.png即可。
获取项目中图片保存路径的代码:
StringSavePath=request.getServletContext().getRealPath("/HeaderUpLoad")+"/" + Account+"UserHeader."+fileExt;
变量路径的值(这里没要图片,只是路径):/Users/liaohang/Documents/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Servlet/HeaderUpLoad/
2.访问上传图片路径
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }
span.s1 { color: #7e504f }
span.s2 { color: #3933ff }
span.Apple-tab-span { white-space: pre }
/*获取项目baseurl*/
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }
span.s1 { color: #7e504f }
String path = request.getContextPath();
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }
span.s1 { color: #7e504f }
span.s2 { color: #3933ff }
span.Apple-tab-span { white-space: pre }
String UserHeaderImagePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/Icons/"+Account+
"UserHeader.jpg";
变量路径的值:http://localhost:8080/Servlet/+HeaderUpLoad+图片名称.jpg
3.限制请求图片大
upload.setSizeMax(1024*1024*2);
upload.setFileSizeMax(1024*1024*2);
等会我在ios部分讲,如果处理上传图片,图片一半限制在500k内。
4.Servlet代码
更加详细的注释在代码中有。
package Servlet; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.tomcat.util.http.fileupload.FileItem; import org.apache.tomcat.util.http.fileupload.FileItemIterator; import org.apache.tomcat.util.http.fileupload.FileItemStream; import org.apache.tomcat.util.http.fileupload.FileUploadBase; import org.apache.tomcat.util.http.fileupload.FileUploadException; import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory; import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.amap.api.mapcore2d.v; import Helper.ImageTranslateClass; import Helper.MySqlHepler; import Helper.ResultToJsonTool; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.UUID; /** * Servlet implementation class Servlet */ //@WebServlet(urlPatterns = "/servlet") @WebServlet("/AupDownloadUserHeaderImageServlet") public class AupDownloadUserHeaderImageServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected final String USER_AGENT = "Mozilla/5.0"; public AupDownloadUserHeaderImageServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) * * */ @SuppressWarnings("resource") protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "text/html"); response.setCharacterEncoding("utf-8"); String Account; int IsOrNoAddScore=0; Account=request.getParameter("account"); DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024*5,new File(request.getServletContext().getRealPath("/Icons"))); // 设置缓冲区大小为 5M factory.setSizeThreshold(1024 * 1024 * 5); // 创建一个文件上传的句柄 ServletFileUpload upload = new ServletFileUpload(factory); //设置上传文件的整个大小和上传的单个文件大小 upload.setSizeMax(1024*1024*50); upload.setFileSizeMax(1024*1024*5); String[] fileExts = {"doc","zip","rar","jpg","txt"}; try { @SuppressWarnings("unchecked") /*加载所有接口请求参数,到一个文件迭代数组中。 */ FileItemIterator list = upload.getItemIterator(request); while(list.hasNext()){ FileItemStream fileItem=list.next(); /*下面判断的是参数类型,如果你的参数中,既有图片流,又有字符串类型,那么就需要判断参数的类型*/ /*如果是字符串参数*/ if(fileItem.isFormField()){ String ShareTmep=fileItem.getFieldName(); if (ShareTmep.length()==11) { //保存字符串参数到一个变量中,等会修改和上传图片都需要它来拼接图片的后缀 Account=fileItem.getFieldName(); } else { //保存字符串参数 IsOrNoAddScore=Integer.parseInt(fileItem.getFieldName()); } }else{ //如果是文件类型 String fileName = fileItem.getName();//得到文件的名字 String fileExt = fileName.substring(fileName.lastIndexOf(".")+1, fileName.length()); if(Arrays.binarySearch(fileExts, fileExt)!=-1){ try { //获取项目存放图片的文件夹,这个文件夹就是我们需要保存上传图片的文件夹,等会我会截图出来 String SavePath=request.getServletContext().getRealPath("/Icons")+"/" + Account+"UserHeader."+fileExt; InputStream inputImageStream= fileItem.openStream(); byte[] buffer = new byte[1024]; //每次读取的字符串长度,如果为-1,代表全部读取完毕 int len = 0; //使用一个输入流从buffer里把数据读取出来 ByteArrayOutputStream outStream = new ByteArrayOutputStream(); while( (len=inputImageStream.read(buffer)) != -1 ){ //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 outStream.write(buffer, 0, len); } //关闭输入流 inputImageStream.close(); //把outStream里的数据写入内存 //得到图片的二进制数据,以二进制封装得到数据,具有通用性 byte[] data = outStream.toByteArray(); //new一个文件对象用来保存图片,默认保存当前工程根目录 File imageFile = new File(SavePath); //创建输出流 FileOutputStream fileOutStream = new FileOutputStream(imageFile); //写入数据 fileOutStream .write(data); //获取项目的baseurl,这个获取是为了等会将这图片地址保存到用户表中对应用户的图片地址字段中 String path = request.getContextPath(); String UserHeaderImagePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/Icons/"+Account+ "UserHeader.jpg"; //下面都是操作数据库 String[] mysqlParameter=new String[]{UserHeaderImagePath,Account}; MySqlHepler.executeUpdate("update - set userHeader=? where account=?", mysqlParameter); if(IsOrNoAddScore>0) { MySqlHepler.executeUpdate("update - set userPhoneUrl=?,userIntegral=userIntegral+5 where account=?", mysqlParameter); } else { MySqlHepler.executeUpdate("update - set userPhoneUrl=?,userIntegral=userIntegral-5 where account=?", mysqlParameter); } JSONObject returnJsonObject =new JSONObject(); try { returnJsonObject.put("Rows", ""); returnJsonObject.put("GetType", "0"); returnJsonObject.put("Success", "1"); returnJsonObject.put("Msg", UserHeaderImagePath); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } response.getWriter().println(returnJsonObject.toString()); } catch (Exception e) { e.printStackTrace(); } }else{ System.out.println("该文件类型不能够上传"); } } } } catch (FileUploadBase.SizeLimitExceededException e) { System.out.println("整个请求的大小超过了规定的大小..."); } catch (FileUploadBase.FileSizeLimitExceededException e) { System.out.println("请求中一个上传文件的大小超过了规定的大小..."); }catch (FileUploadException e) { e.printStackTrace(); } }
二、 Objective-c代码
1.图片压缩
传入一个指定的尺寸,将图片压缩到指定大小。
/*图片压缩到指定大小*/ + (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize TgeImage:(UIImage *)sourceImage { UIImage *newImage = nil; CGSize imageSize = sourceImage.size; CGFloat width = imageSize.width; CGFloat height = imageSize.height; CGFloat targetWidth = targetSize.width; CGFloat targetHeight = targetSize.height; CGFloat scaleFactor = 0.0; CGFloat scaledWidth = targetWidth; CGFloat scaledHeight = targetHeight; CGPoint thumbnailPoint = CGPointMake(0.0,0.0); if (CGSizeEqualToSize(imageSize, targetSize) == NO) { CGFloat widthFactor = targetWidth / width; CGFloat heightFactor = targetHeight / height; if (widthFactor > heightFactor) scaleFactor = widthFactor; // scale to fit height else scaleFactor = heightFactor; // scale to fit width scaledWidth= width * scaleFactor; scaledHeight = height * scaleFactor; // center the image if (widthFactor > heightFactor) { thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; } else if (widthFactor < heightFactor) { thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; } } UIGraphicsBeginImageContext(targetSize); // this will crop CGRect thumbnailRect = CGRectZero; thumbnailRect.origin = thumbnailPoint; thumbnailRect.size.width= scaledWidth; thumbnailRect.size.height = scaledHeight; [sourceImage drawInRect:thumbnailRect]; newImage = UIGraphicsGetImageFromCurrentImageContext(); if(newImage == nil) NSLog(@"could not scale image"); //pop the context to get back to the default UIGraphicsEndImageContext(); return newImage; }
2.调用
调用获取压缩图片,并将压缩图片转换成我们要请求上传的类型nsdata
1 UIImage *TempImage=[AFDataDefine imageByScalingAndCroppingForSize:CGSizeMake(editedImage.size.width/2, editedImage.size.height/2) TgeImage:editedImage]; 2 NSData *ImageData= UIImageJPEGRepresentation(TempImage, 1.0);
3.http请求.
NSDictionary *RequestParameter=[[NSDictionary alloc]initWithObjectsAndKeys: [[WDUser currentUser] GetUserValue:@"account"],[[WDUser currentUser] GetUserValue:@"account"],IsOrNoAddScore,IsOrNoAddScore,nil]; [SVProgressHUD showWithStatus:@"正在上传......" maskType:SVProgressHUDMaskTypeBlack]; [[WDUser currentUser] upDownloadUserHeaderImage:RequestParameter setMethordName:@"AupDownloadUserHeaderImageServlet" ImageData:ImageData block:^(RespInfo *retobj) { if (retobj.mBSuccess) { int Score=[[[WDUser currentUser]GetUserValue:@"userIntegral"]intValue]; Score=Score+[IsOrNoAddScore intValue]; NSString *ScoreC=[NSString stringWithFormat:@"%d",Score]; [[WDUser currentUser] SetUserValue:@"userIntegral" setValue: ScoreC]; MainTableHeaderMasterView.userScoreLabel.text= [NSString stringWithFormat:@"积分:%@ 累计积分:%@",ScoreC,[[WDUser currentUser] GetUserValue:@"userTotalIntegral"]]; NSString *NewHeaderPath=retobj.mMsg; [[WDUser currentUser] SetUserValue:@"userPhoneUrl" setValue:NewHeaderPath]; [UIView animateWithDuration:0.1 animations:^{ [AlertBackBlackView setFrame:CGRectMake(, DEVICE_Height+DEVICE_TabBar_Height+,DEVICE_Width,DEVICE_Height+DEVICE_TabBar_Height+)]; } completion:^(BOOL finished) { [UIView animateWithDuration:0.5 animations:^{ [ContentBackView setFrame:CGRectMake(,DEVICE_Height+DEVICE_TabBar_Height+,DEVICE_Width,DEVICE_Height*0.41)]; }]; }]; [SVProgressHUD dismiss]; } else{ showMessage(@"修改失败,请稍候再试。"); [SVProgressHUD dismiss]; [UIView animateWithDuration:0.1 animations:^{ [AlertBackBlackView setFrame:CGRectMake(, DEVICE_Height+DEVICE_TabBar_Height+,DEVICE_Width,DEVICE_Height+DEVICE_TabBar_Height+)]; } completion:^(BOOL finished) { [UIView animateWithDuration:0.5 animations:^{ [ContentBackView setFrame:CGRectMake(,DEVICE_Height+DEVICE_TabBar_Height+,DEVICE_Width,DEVICE_Height*0.41)]; }]; }]; LoginVC *VC=[[LoginVC alloc]init]; [[WDUser currentUser]logout]; [self pushViewController:VC]; } }];
4.封装的http调用方法
/*头像上传*/ -(void)upDownloadUserHeaderImage:(NSDictionary *)paramDic setMethordName:(NSString *)MethordName ImageData:(NSData *)imageData block:(void(^)(RespInfo* retobj))block { [[APIClient sharedClient] postUImageURL:MethordName parameters:paramDic ImageData:imageData call:^(RespInfo *info) { block(info); }]; }
-(void)postUImageURL:(NSString *)URLString parameters:(id)parameters ImageData:(NSData *)imageData call:(void (^)( RespInfo* info))callback { //首先判断是否有网络 [self checkNetWorkingIsOrNoUse:^(int StateOrType) { ) { RespInfo* retobj = [[RespInfo alloc]init]; retobj.mBSuccess=NO; NSString *AlertInfo=@"请检查网络是否畅通。"; retobj.mMsg=AlertInfo; callback(retobj); } else { NSString *Url=[NSString stringWithFormat:@"%@%@",self.baseURL,URLString]; NSString *Url1=[NSString stringWithFormat:@"%@%@",self.baseURL,URLString]; NSString *Url2=[NSString stringWithFormat:@"%@%@",self.baseURL,URLString]; [self POST:Url parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { [formData appendPartWithFileData:imageData name:@"file" fileName:@"touxiang.jpg" mimeType:@"image/jpeg"]; } success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { RespInfo* retobj = [[RespInfo alloc]initWithDic:responseObject]; callback( retobj ); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { //UtilMethod imageWithImageSimple callback( [RespInfo infoWithError:error]); }]; } }]; }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }
span.s1 { color: #000000 }
span.s2 { color: #7e504f }
span.s3 { color: #3933ff }
span.Apple-tab-span { white-space: pre }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }
span.s1 { color: #000000 }
span.s2 { color: #7e504f }
Java Servlet+Objective-c图上传 步骤详细的更多相关文章
- java servlet 3.0文件上传
在以前,处理文件上传是一个很痛苦的事情,大都借助于开源的上传组件,诸如commons fileupload等.现在好了,很方便,便捷到比那些组件都方便至极.以前的HTML端上传表单不用改变什么,还是一 ...
- Java企业微信开发_07_JSSDK多图上传
一.本节要点 1.1可信域名 所有的JS接口只能在企业微信应用的可信域名下调用(包括子域名),可在企业微信的管理后台“我的应用”里设置应用可信域名.这个域名必须要通过ICP备案,不然jssdk会配置失 ...
- js formData图片上传(单图上传、多图上传)后台java
单图上传 <div class="imgUp"> <label>头像单图</label> <input type=&quo ...
- Java实现对文件的上传下载操作
通过servlet,实现对文件的上传功能 1.首先创建一个上传UploadHandleServlet ,代码如下: package me.gacl.web.controller; import jav ...
- java深入探究10-文件上传组件FileUpload,邮件开发
1.文件上传组件FileUpload 1)java提供了文件上传的工具包 需要引入:commons-fileupload-1.2.1.jar(文件上床组件核心包) commons-oi-1.4(封装了 ...
- 使用jsp/servlet简单实现文件上传与下载
使用JSP/Servlet简单实现文件上传与下载 通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...
- JAVA Web 之 struts2文件上传下载演示(一)(转)
JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...
- Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题 swfUpload多文件上传
Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题(转) 我们都知道普通的文件上传是通过表单进行文件上传的,还不能达到异步上传的目的.通过使用某些技术手段,比如jqu ...
- springBoot+ vue+ Element-ui实现合并多图上传(一次请求多张图片)
这次上传使用的是Elemet-ui的uoload上传组件,组件预留的钩子回调还是比较充足的. 1: 实现多图上传主要用到以下两个属性: 下面讲一下属性使用: <el-upload :actio ...
随机推荐
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- 深入理解 JavaScript,以及 Linux 下的开发调试工具
前言 JavaScript 是我接触到的第二门编程语言,第一门是 C 语言.然后才是 C++.Java 还有其它一些什么.所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了.早就想写 ...
- PHP static静态属性和静态方法
这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...
- 统计iOS项目的总代码行数的方法
打开终端, 用cd命令 定位到工程所在的目录,然后调用以下命名即可把每个源代码文件行数及总数统计出来: find . "(" -name "*.m" -or - ...
- BPM配置故事之案例12-触发另外流程
还记得阿海么,对就是之前的那个采购员,他又有了些意见. 阿海:小明,你看现在的流程让大家都这么方便,能不能帮个忙让我也轻松点啊-- 小明:--你有什么麻烦,现在不是已经各个部门自己提交申请了嘛? 阿海 ...
- iOS之延时执行(睡眠)的几种方法
1. 最直接的方法: [self performSelector:@selector(deleyMethod) withObject:nil afterDelay:1.0]; 此方式要求必须在主线程中 ...
- Oracle中的commit详解
本文转自 : http://blog.csdn.net/hzhsan/article/details/9719307 它执行的时候,你不会有什么感觉.commit在数据库编程的时候很常用,当你执行DM ...
- firebug不能加载JS文件 ,无法进行JS脚本调试
提示: 本页面不包含 Javascript 如果 <script> 标签有 "type" 属性,其值应为 "text/javascript" 或者& ...
- struts2国际化
struts2国际化 1:什么是国际化? 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有的与语言,国家/地区和文化相关的元素 ...
- 一个标签的72变,打造一个纯CSS图标库
每次要用到图标的时候都会到 icono 去copypaste,但每次用到的时候尺寸都各不一样,总是要调整参数,巨烦.当然你可以会想到用zoom.scale来做缩放,但是这样的缩放会使得线宽也变粗了,不 ...