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 ...
随机推荐
- CSS常见技巧
一.CSS Sprite(雪碧图|精灵图)指什么? 有什么作用? CSS雪碧 即CSS Sprite,也有人叫它CSS精灵,是一种CSS图像合并技术,该方法是将小图像和背景图片合并到一张图片上,然后利 ...
- Android 指纹认证
安卓指纹认证使用智能手机触摸传感器对用户进行身份验证.Android Marshmallow(棉花糖)提供了一套API,使用户很容易使用触摸传感器.在Android Marshmallow之前访问触摸 ...
- SymmetricDS 快速和灵活的数据库复制
开始谈谈开源的SymmetricDS,谈谈实际使用中,遇到的一些问题和解决办法.持续更新: SymmetricDS 快速和灵活的数据库复制 实际使用 和 埋过的坑 (一)知识篇 SymmetricDS ...
- ORA-00821: Specified value of sga_target 3072M is too small, needs to be at least 12896M
在测试PlateSpine克隆的数据库服务器时,由于资源有限,克隆过来的数据库服务器只给了9G的内存,结果在测试时,老是会出现OOMkiller导致宕机,即out of memory killer,是 ...
- ubuntu进行子域名爆破
好记性不如烂笔头,此处记录一下,ubuntu进行子域名的爆破. 先记录一个在线的子域名爆破网址,无意中发现,很不错的网址,界面很干净,作者也很用心,很感谢. https://phpinfo.me/do ...
- [BOT]自己动手实现android 饼状图,PieGraphView,附源码解析
本文要介绍的是一个参照手机支付宝app里面记账本功能里的"饼状图"实现的控件.通常app中可能的数据展示控件有柱状图,折线图,饼状图等,如果需要一个包含多种View控件的库,那么 ...
- Mono 3.2.7发布,JIT和GC进一步改进
Mono 3.2.7已经发布,带来了很多新特性,如改进的JIT.新的面向LINQ的解释器以及使用了64位原生指令等等. 这是一次主要特性发布,累积了大约5个月的开发工作.看上去大部分改进都是底层的性能 ...
- UWP控件与DataBind
在uwp开发中必不可少的一个环节就是各种通用的控件的开发,所以在闲暇时间汇总了一下在uwp开发中控件的几种常用写法,以及属性的几种绑定方式,有可能不全面,请大家多多包涵 :) 1.先从win10新增的 ...
- AngularJS 第三天----作用域
作用域的概念及其功能 AngularJS使用作用域的概念来充当数据模型的作用,在视图和控制器之间起着桥梁的作用.由于双向绑定的数据特性,视图的修改会更新 $scope,同样对 $scope的修改也会重 ...
- 用SSH访问内网主机的方法
如今的互联网公司通常不会直接自己直接配主机搭建服务器了,而是采用了类似阿里云的这种云主机,当应用变得越来越大了之后,就不可避免地增加主机,而出于成本考虑,不可能给每一台主机都分配公网带宽,所以实际的情 ...