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 ...
随机推荐
- MongoDB系列(一):简介及安装
什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为应用提供可扩展的高 ...
- javascript动画系列第二篇——磁性吸附
× 目录 [1]范围限定 [2]拖拽范围 [3]磁性吸附 前面的话 上一篇,我们介绍了元素拖拽的实现.但在实际应用中,常常需要为拖拽的元素限定范围.而通过限定范围,再增加一些辅助的措施,就可以实现磁性 ...
- winform 窗体圆角设计
网上看到的很多winform窗体圆角设计代码都比较累赘,这里分享一个少量代码就可以实现的圆角.主要运用了System.Drawing.Drawing2D. 效果图 代码如下. private void ...
- PHP设计模式(七)适配器模式(Adapter For PHP)
适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 如下图(借图): // 设置书的接口 // 书接口 interface BookI ...
- Android系统默认对话框添加图片
开发工具Android Studio 今天公司UI要求软件对话框改成加图片的,以前没有做过,所以就学习了一下,废话不多说, 看效果: 创建XML文件dialog_lsit_item.xml <L ...
- Oracle:一个用户操作多个表空间中表的问题(转)
原文地址:http://blog.csdn.net/shmiloy001/article/details/6287317 首先,授权给指定用户. 一个用户的默认表空间只能有一个,但是你可以试下用下面的 ...
- mono for android学习过程系列教程(5)
这一讲主要需要了解的安卓UI元素是Spinner.这个元素类似我们 winform和webform里面的下拉选项. 首先我们先建立一个新的项目,命名为SpinnerExample. 然后在Layout ...
- Hadoop4 利用VMware搭建自己的hadoop集群
前言: 前段时间自己学习如何部署伪分布式模式的hadoop环境,之前由于工作比较忙,学习的进度停滞了一段时间,所以今天抽出时间把最近学习的成果和大家分享一下. 本文要介绍的是如 ...
- JAVA通信系列二:mina入门总结
一.学习资料 Mina入门实例(一) http://www.cnblogs.com/juepei/p/3939119.html Mina入门教程(二)----Spring4 集成Mina http:/ ...
- protocol buffers vs json vs XML
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 在分布式系统中,数据序列化传递的情形非常常见,主流的三种,JSON.XML.Protobuf. XML现在 ...