1. 客户端三个注意事项
* method="post"
* enctype="multipart/form-data"
* <input type="file" name="myfile">
2. Struts2框架的使用拦截器完成了文件上传,并且底层使用也是FileUpload开源的组件。
* 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容
* fileUpload拦截器 默认在 defaultStack 栈中, 默认会执行的
* 在Action中编写文件上传,需要定义三个属性
> 文件类型File ,属性名与表单中file的name属性名一致.
> 字符串类型String , 属性名:前段是name属性名一致 + ContentType;
> 字符串类型String , 属性名:前段是name属性名一致+FileName;
> 最后需要为上述的三个属性提供set方法。
> 可以通过FileUtils提供 copyFile 进行文件复制,将上传文件 保存到服务器端
代码如下:
/**
* 文件的上传,需要在CustomerAction类中定义成员的属性,命名是有规则的!!
* private File upload; // 表示要上传的文件
* private String uploadFileName; 表示是上传文件的名称(没有中文乱码)
* private String uploadContentType; 表示上传文件的MIME类型
* 提供set方法,拦截器就注入值了
*/
// 要上传的文件
private File upload;
// 文件的名称
private String uploadFileName;
// 文件的MIME的类型
private String uploadContentType;
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
4. 文件上传中存在的问题
* 先配置input逻辑视图
* 在页面中显示错误信息
* 文件上传的总大小默认值是2M,如果超过了2M,程序会报出异常。可以使用<s:actionError>来查看具体信息!
> 解决总大小的设置,找到常量:
* struts.multipart.parser=jakarta -- 默认文件上传解析器,就是FileUpload组件
* struts.multipart.saveDir= -- 文件上传的临时文件存储目录
* struts.multipart.maxSize=2097152 -- 文件上传的最大值(总大小),默认是2M
> 可以在struts.xml中设置常量,修改文件上传的默认总大小!!!
* <constant name="struts.multipart.maxSize" value="5000000"></constant>
5. 还可以通过配置拦截器来设置文件上传的一些属性
* 先在<action>标签中引入文件上传的拦截器
<interceptor-ref name="defaultStack">
<!-- 设置单个上传文件的大小 -->
<param name="fileUpload.maximumSize">2097152</param>
<!-- 设置扩展名 -->
<param name="fileUpload.allowedExtensions">.txt</param>
</interceptor-ref>
jsp代码:
<form action="${pageContext.request.contextPath}/restaurant_edit" method="post" enctype="multipart/form-data">
<table>
<tr>
<td> 店铺图片</td>
<td><input type="file" name="upload"></td>
</tr>
<tr>
<td>店铺名称</td>
<td><input type="text" name="restaurant_name" value="${restaurant.restaurant_name }"></td>
</tr>
<tr>
<td>店铺关键词</td>
<td><input type="text" name="keywords" value="${restaurant.keywords }"></td>
</tr>
<tr>
<td>店铺详情</td>
<td><input type="text" name="detail" value="${restaurant.detail }"></td>
</tr>
<tr>
<td>店铺营业时间</td>
<td><input type="text" name="business_time" value="${restaurant.business_time }"></td>
</tr>
<tr>
<td>店铺电话</td>
<td><input type="text" name="tel" value="${restaurant.tel }"></td>
</tr>
<tr>
<td>店铺位置</td>
<td><input type="text" name="address" value="${restaurant.address }"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
action中的代码:
/**
* 文件的上传,需要在CustomerAction类中定义成员的属性,命名是有规则的!!
* private File upload; // 表示要上传的文件
* private String uploadFileName; 表示是上传文件的名称(没有中文乱码)
* private String uploadContentType; 表示上传文件的MIME类型
* 提供set方法,拦截器就注入值了
*/
// 要上传的文件
private File upload;
// 文件的名称
private String uploadFileName;
// 文件的MIME的类型
private String uploadContentType;
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String edit() throws IOException{
// 做文件的上传,说明用户选择了上传的文件了
if(uploadFileName != null){
// 打印
System.out.println("文件类型:"+uploadContentType);
// 把文件的名称处理一下
String uuidname = UploadUtils.getUUIDName(uploadFileName);
// 把文件上传到D:\\apache-tomcat-7.0.52\\webapps\\upload
String path=ServletActionContext.getServletContext().getRealPath("/business/image/");
(这里我把图片保存在项目下的/business/image/目录中,或者保存在服务器中,一般都会保持在图片服务器中。)
//String path = "F:\\apache-tomcat-7.0.42\\webapps\\upload\\";
// 创建file对象
File file = new File(path+"//"+uuidname);
// 简单方式
FileUtils.copyFile(upload, file);
System.out.println(path+uuidname);
//System.out.println("111"+restaurant);
// 把上传的文件的路径,保存到客户表中
restaurant.setImg(uuidname);
Business business=(Business) ServletActionContext.getRequest().getSession().getAttribute("exitBusiness");
restaurant.setRestaurant_id(business.getBid());
System.out.println("111"+restaurant);
}
// 修改客户成功了
restaurantService.update(restaurant);
//查询,返回展示页面
findById();
return "store";
}
service代码:
@Transactional
public void update(Restaurant restaurant) {
restaurantDao.update(restaurant);
}
dao 代码:
public void update(Restaurant restaurant) {
this.getHibernateTemplate().update(restaurant);
}
前端显示界面:
<div class="clearfix h44"></div>
<div class="store_img" ng-click="func_showAction()">
<img src="<c:url value='/business/image/${restaurant.img }'/>" alt="" id="store_img">
<span>图片</span>
</div>
<div class="store_name" ui-sref="storeName">
<span class="store_name_tip">店铺电话</span>
<span class="store_name_show">${restaurant.tel }
<i>></i>
</span>
</div>
<div class="store_name" ui-sref="storeName">
<span class="store_name_tip">店铺营业时间</span>
<span class="store_name_show">${restaurant.business_time }
<i>></i>
</span>
</div>
<div class="store_name" ui-sref="storeName">
<span class="store_name_tip">店铺详情</span>
<span class="store_name_show">${restaurant.detail }
<i>></i>
</span>
</div>
<div class="store_name" ui-sref="storeName">
<span class="store_name_tip">店铺名称</span>
<span class="store_name_show">${restaurant.restaurant_name }
<i>></i>
</span>
</div>
<div class="store_name" ui-sref="storeName">
<span class="store_name_tip">店铺关键词</span>
<span class="store_name_show">${restaurant.keywords }
<i>></i>
</span>
</div>
<div class="clearfix"></div>
<div class="store_address" ui-sref="storeAddress">
<span class="store_address_tip">店铺位置</span>
<span class="store_address_show">${restaurant.address }
<i>></i>
</span>
</div>
<input type="button" value="修改" οnclick="edit()">
</ion-view>
</body>
<script type="text/javascript">
function edit(){
window.location.href="${pageContext.request.contextPath}/restaurant_preEdit";
}
</script>