第一种方式
在jsp页面中使用普通的方法
<!--
文件上传两步操作:
1.上传表单界面
method:必须为post
enctype:必须为multipart/form-data
2.服务器中处理上传信息
-->
<form action="uploadServlet" method="post" enctype="multipart/form-data">
账号:<input type="text" name="uname"><br>
地址:<input type="text" name="address"><br>
图片:<input type="file" name="upload"><br>
<input type="submit" value="上传">
</form>
在servlet中使用io流进行上传
ServletInputStream in = request.getInputStream();
OutputStream out = new FileOutputStream("");
int num = 0;
byte[] b = new byte[1024];
while((num=in.read(b)) !=-1){
out.write(b, 0, num);
}
in.close();
out.flush();
out.close();
PrintWriter o = response.getWriter();
o.write("ok");
o.flush();
o.close();*/
//用上面的方式处理上传文件的时候,文件大小增大,原因是在用流传递文件的时候,浏览器会在头部加上一些属性信息
第二种方式
<form method="post" action="uploadServlet" class="form-horizontal" id="myForm" enctype="multipart/form-data">
<div class="form-group">
<label class="col-sm-3 control-label">公司名称</label>
<div class="col-sm-7">
<input type="text" class="form-control" name="companyname" id="companyname">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">法人姓名</label>
<div class="col-sm-7">
<input type="text" name="managername" class="form-control">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">手机号码</label>
<div class="col-sm-7">
<input type="text" class="form-control" name="phone">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">身份证号码</label>
<div class="col-sm-7">
<input type="text" class="form-control" name="identity">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">身份证正面</label>
<div class="col-sm-7">
<input type="file" name="identitypositive">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">身份证反面</label>
<div class="col-sm-7">
<input type="file" name="identitynegative">
</div>
</div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-primary" type="submit">保存内容</button>
<button class="btn btn-white" type="submit">取消</button>
</div>
</div>
</form>
servlet.java
这时要导入commons-fileupload-1.2.2.jar 和 commons-io-1.4.jar
这种是表单数据和图片上传同时进行,不是很好,冗余太高
// 使用FileUpload 处理上传文件
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
// 解析request请求 list获取的就是表单域中的每个域
List<FileItem> list = upload.parseRequest(request);
TenantBean tb = new TenantBean();
for (FileItem fi : list) {
String filedName = fi.getFieldName();
//System.out.println(fileName);
if(fi.isFormField()){
// 普通表单域
String value= fi.getString("utf-8");
System.out.println(filedName+"="+value);
if("companyname".equals(filedName)){
tb.setCompanyname(value);
}else if("managername".equals(filedName)){
tb.setManagername(value);
}else if("phone".equals(filedName)){
tb.setPhone(value);
}else if("identity".equals(filedName)){
tb.setIdentity(value);
}
}else{
// 获取文件名称a.sdfsd.0.jpg aaaa.xls aaaa.exe ssss.png
// 文件存储的名字我们需要自定义 名称需要改变但是文件的后缀不能改变
String oldName = fi.getName();
String path = "F:/tomcat/apache-tomcat-7.0.90/webapps/show/"; //这是存储的地址
String newName = new Date().getTime()+(int)(Math.random()*100)+oldName.substring(oldName.lastIndexOf("."));
if("identitypositive".equals(filedName)){
// 正面
tb.setIdentitypositive(path+newName);
}else{
//反面
tb.setIdentitynegative(path+newName);
}
System.out.println(newName);
// 上传的文件
File file = new File(path+newName);
fi.write(file);
//这样来上传图片的话 图片的地址在数据库中存储的很长
}
}
// 保存数据进入数据库
tenantService.add(tb);
response.sendRedirect(request.getContextPath()+"/tenant/add_tenant.jsp");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
第三种方式
jsp页面
使用上传插件webupload 使得表单提交和文件上传分开执行
<form action="uploadServlet" method="post" enctype="multipart/form-data">
<div class="form-group">
<!-- div id; inp ty -------->
<label class="col-sm-3 control-label">身份证正面</label>
<div class="col-sm-7">
<div id="uploader" class="wu-example">
<!--用来存放文件信息-->
<div id="thelist1" class="uploader-list"></div>
<div class="btns" id="idcard_id1">
<div id="picker1">选择文件</div>
<!-- button如果不指定 type 为button 默认是submit -->
<button id="ctlBtn1" type="button" class="btn btn-default">开始上传</button>
</div>
</div>
<!-- 身份证正面隐藏域表单,value是图片上传成功以后的 地址 -->
<input type="hidden" id="identitypositive" name="identitypositive" /> 添加到的位置
</div>
</div>
</form>
<script type="text/javascript">
// 身份证正面
jQuery(function() {
var $ = jQuery,
$list = $('#thelist1'), // thelist节点中添加文本 身份证正面 div添加
$btn = $('#ctlBtn1'), // 文件上传按钮 身份证正面 文件上传按钮
state = 'pending',
uploader;
//初始化
uploader = WebUploader.create({
// 不压缩image
resize: false,
// 文件接收服务端。
server: "fileUpload",
// 选择文件的按钮。可选。
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
//开始上传 按钮的id
pick: '#picker1' ,
// 只允许选择图片文件。
accept: {
title: 'Images',
extensions: 'jpg,jpeg,bmp,png',
mimeTypes: 'image/*'
},
//允许上传的文件个数
fileNumLimit:1,
//单个文件最大的上传限制 1M
fileSingleSizeLimit : 1024 * 1024 // 1M
});
// 当有文件添加进来的时候
uploader.on( 'fileQueued', function( file ) {
$list.append( '<div id="' + file.id + '" class="item">' +
'<h4 class="info">' + file.name + '</h4>' +
'<p class="state">等待上传...</p>' +
'</div>' );
});
// 文件上传过程中创建进度条实时显示。
uploader.on( 'uploadProgress', function( file, percentage ) {
var $li = $( '#'+file.id ),
$percent = $li.find('.progress .progress-bar');
// 避免重复创建
if ( !$percent.length ) {
$percent = $('<div class="progress progress-striped active">' +
'<div class="progress-bar" role="progressbar" style="width: 0%">' +
'</div>' +
'</div>').appendTo( $li ).find('.progress-bar');
}
$li.find('p.state').text('上传中');
$percent.css( 'width', percentage * 100 + '%' );
});
//文件上传成功后 触发的事件 触发一个回调函数
uploader.on( 'uploadSuccess', function( file,response) {
console.log(file);
console.log(response);
console.log("---"+response.code+"-------reData:"+response.msg+ "---" );
// 上传的图片保存的相对位置
var idcard_url = $(response).attr("_raw");
$("#idcard_id1").append("<br><img src='http://localhost:8081/show/"+idcard_url+"' style='width: 150px;height: 150px' />");
//将url 添加到 form表单的隐藏域中
$("#identitypositive").val(idcard_url);
$( '#'+file.id ).find('p.state').text('已上传');
});
uploader.on( 'uploadError', function( file ) {
//TODO
$( '#'+file.id ).find('p.state').text('上传出错');
});
uploader.on( 'uploadComplete', function( file ) {
$( '#'+file.id ).find('.progress').fadeOut();
});
uploader.on( 'all', function( type ) {
if ( type === 'startUpload' ) {
state = 'uploading';
} else if ( type === 'stopUpload' ) {
state = 'paused';
} else if ( type === 'uploadFinished' ) {
state = 'done';
}
if ( state === 'uploading' ) {
$btn.text('暂停上传');
} else {
$btn.text('开始上传');
}
});
//出错以后回调的函数
uploader.on("error",function(type){
alert(type);
if(type == "F_EXCEED_SIZE"){
layer.alert('最大只能上传1M文件', {
skin: 'layui-layer-molv' //样式类名
});
}
});
$btn.on( 'click', function() {
if ( state === 'uploading' ) {
uploader.stop();
} else {
uploader.upload();
}
});
});
</script>
要使用到的时候
String companyname = request.getParameter("companyname");
String phone =request.getParameter("phone");
String managername =request.getParameter("managername");
String identity =request.getParameter("identity");
String identitypositive =request.getParameter("identitypositive"); //可以通过request找到这个域的方法
String identitynegative =request.getParameter("identitynegative");
TenantBean tb = new TenantBean();
tb.setCompanyname(companyname);
tb.setPhone(phone);
tb.setManagername(managername);
tb.setIdentitynegative(identitynegative);
tb.setIdentity(identity);
tb.setIdentitypositive(identitypositive);
tenantService.add(tb);
response.sendRedirect(request.getContextPath()+"/tenant/add_tenant_webupload.jsp");