ssh框架--图片(文件)上传

来源:互联网 发布:农村淘宝app下载安装 编辑:程序博客网 时间:2024/06/05 07:19

看过很多关于图片上传的demo,但是都比较乱。本案例经过我几次调整,整理成了一个工具类,与大家分享之。

第一步:准备工作。如果status2.3.4版本以下,struts2在上传文件的时候 upload.parseRequest(request)值将为空,解决办法是写一个继承JakartaMultiPartRequest类的子类,如下所示:

public class RequestParseWrapper extends JakartaMultiPartRequest {@Overridepublic void parse(HttpServletRequest arg0, String arg1) throws IOException {}}

同时在struts.xml配置文件中配置加入:

<bean type= "org.apache.struts2.dispatcher.multipart.MultiPartRequest"   name= "myRequestParser"   class= "com.zho.app.status.request.file.RequestParseWrapper"   scope= "default"  optional= "true"/>   <constant name= "struts.multipart.handler" value= "myRequestParser"/> 
第二步:前端提交:提交的方式有两种,第一种是表单提交,这里需要注意的是form表单中form标签中加入属性enctype="multipart/form-data",并且method必须是post提交方式,如下所示:
<form action="<%=basePath %>/sharedFarmUsers_sp/posting.action" enctype="multipart/form-data" method="post" id="mytest_id"><input type="text" name="userid" /><br /> <input type="file" id="f2" name="image" /><br /> <input type="submit" value="上传" /><br /></form>
第二种提交方式是异步提交,需要导入jquery.form.js文件,form表单属性同第一种一致,但不用写action属性。

<form id="contentForm" method="post" enctype="multipart/form-data"><div><span>正文内容</span><div><input type="text" name="consultationid" value="${consultationid }"><select id="type_id" name="type"><option value="0">图片</option><option value="1">文本</option></select><div id=typeview></div><!-- <input type="file" name="value"/><br><textarea rows="3" cols="80" name="value"></textarea> --></div><br></div><p><input type="button" value="正文编辑" onclick="consultationTextEditor()"/><input type="reset" value="重置"/></p><p><span>${success }</span></p></form>
<script type="text/javascript">function consultationTextEditor(){var option={type:'POST',url:'<%=path %>/sharedFarmAdmin_sp/consultationTextEditor.action',dataType:'text',data: '',success:function(data){}};$("#contentForm").ajaxSubmit(option);}</script>
第三步:后台接受把图片存入服务器中,把传入服务器中的图片地址存入数据库。
public void posting() throws IOException{HttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response = ServletActionContext.getResponse();response.setContentType("text/json; charset=utf-8");        response.setHeader("Cache-Control", "no-cache"); //取消浏览器缓存PrintWriter out = response.getWriter();Map<String, Object> map = MyUpload.upLoad(request,"image");//获取到普通文本userid存入到map,图片image上传至服务器并把地址存入map中String json = "{\"success\":"+0+"}";String zjson = "{\"success\":"+1+"}";Integer save = sharedFarmUsersManager.save("Posts", map);//采用动态的方式把数据存入数据库if(save != -1){out.print(json);}else{out.print(zjson);}out.flush();        out.close();}
以下是经过本人整合的图片(文件)上传工具类:
package com.zho.app.util.check;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.UUID;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.io.FilenameUtils;import org.apache.struts2.ServletActionContext;import com.sun.jersey.api.client.Client;import com.sun.jersey.api.client.WebResource;/** *  * @author zho * @Time 2017-08-08 * 作用:form表单提交方式   图片上传模板 */public class MyUpload {public static Map<String, Object> upLoad(HttpServletRequest request){return MyUpload.upLoad(request,null);}public static Map<String, Object> upLoad(HttpServletRequest request, String type){// 判断表单是否支持文件上传。即:enctype="multipart/form-data"boolean isMultipartContent = ServletFileUpload.isMultipartContent(request);if (!isMultipartContent) {throw new RuntimeException("your form is not multipart/form-data");}// 创建一个DiskFileItemfactory工厂类DiskFileItemFactory factory = new DiskFileItemFactory();String contextPath = request.getContextPath();// 指定临时文件的存储目录factory.setRepository(new File("d:\\"));//测试用// 创建一个ServletFileUpload核心对象ServletFileUpload fileUpload = new ServletFileUpload(factory);// 解决上传表单项乱码问题fileUpload.setHeaderEncoding("UTF-8");Map<String, Object> map = new HashMap<String, Object>();// 解析request对象,并得到一个表单项的集合try {// 限制上传文件的大小// fileUpload.setFileSizeMax(1024*1024*3);//表示3M大小// fileUpload.setSizeMax(1024*1024*6);List<FileItem> fileItems = fileUpload.parseRequest(request);for (FileItem fileitem : fileItems) {if (fileitem.isFormField()) {// 普通表单项String[] formField = processFormField(fileitem);if(formField[1] != null && !formField[1].isEmpty() ) map.put(formField[0], formField[1]);} else {// 上传表单项if(!(fileitem.getName() == null || fileitem.getName().isEmpty())){String[] UploadField = processUploadField(fileitem,type);map.put(UploadField[0], UploadField[1]);}}}} catch (FileUploadException e) {e.printStackTrace();}return map;}/** * 头像上传 */public static Map<String, Object> upLoadToAvatar(HttpServletRequest request, String type){// 判断表单是否支持文件上传。即:enctype="multipart/form-data"boolean isMultipartContent = ServletFileUpload.isMultipartContent(request);if (!isMultipartContent) {throw new RuntimeException("your form is not multipart/form-data");}// 创建一个DiskFileItemfactory工厂类DiskFileItemFactory factory = new DiskFileItemFactory();String contextPath = request.getContextPath();// 指定临时文件的存储目录factory.setRepository(new File("d:\\"));//测试用// 创建一个ServletFileUpload核心对象ServletFileUpload fileUpload = new ServletFileUpload(factory);// 解决上传表单项乱码问题fileUpload.setHeaderEncoding("UTF-8");Map<String, Object> map = new HashMap<String, Object>();// 解析request对象,并得到一个表单项的集合try {// 限制上传文件的大小// fileUpload.setFileSizeMax(1024*1024*3);//表示3M大小// fileUpload.setSizeMax(1024*1024*6);List<FileItem> fileItems = fileUpload.parseRequest(request);String id = "";for (FileItem fileitem : fileItems) {if (fileitem.isFormField()) {// 普通表单项String[] formField = processFormField(fileitem);if(formField[1] != null && !formField[1].isEmpty() ) map.put(formField[0], formField[1]);id = formField[1];} if (!(fileitem.isFormField())) {// 上传表单项if(!(fileitem.getName() == null || fileitem.getName().isEmpty())){String[] UploadField = processUploadField(fileitem,type,id);map.put(UploadField[0], UploadField[1]);}}}} catch (FileUploadException e) {e.printStackTrace();}return map;}/** * 跨服务器上传 */public static Map<String, Object> upLoadCrossServer(HttpServletRequest request){// 判断表单是否支持文件上传。即:enctype="multipart/form-data"boolean isMultipartContent = ServletFileUpload.isMultipartContent(request);if (!isMultipartContent) {throw new RuntimeException("your form is not multipart/form-data");}// 创建一个DiskFileItemfactory工厂类DiskFileItemFactory factory = new DiskFileItemFactory();factory.setRepository(new File("d:\\"));// 指定临时文件的存储目录// 创建一个ServletFileUpload核心对象ServletFileUpload fileUpload = new ServletFileUpload(factory);// 解决上传表单项乱码问题fileUpload.setHeaderEncoding("UTF-8");Map<String, Object> map = new HashMap<String, Object>();// 解析request对象,并得到一个表单项的集合try {// 限制上传文件的大小// fileUpload.setFileSizeMax(1024*1024*3);//表示3M大小// fileUpload.setSizeMax(1024*1024*6);List<FileItem> fileItems = fileUpload.parseRequest(request);for (FileItem fileitem : fileItems) {if (fileitem.isFormField()) {// 普通表单项String[] formField = processFormField(fileitem);map.put(formField[0], formField[1]);} else {// 上传表单项if(!(fileitem.getName() == null || fileitem.getName().isEmpty())){String[] UploadField = processUploadFieldCrossServer(fileitem);map.put(UploadField[0], UploadField[1]);}}}} catch (FileUploadException e) {e.printStackTrace();}return map;}// 普通表单项private static String[] processFormField(FileItem fileitem) {String fieldname = null;String fieldvalue = null;try {fieldname = fileitem.getFieldName();// 字段名fieldvalue = fileitem.getString("UTF-8");// 字段值//fieldvalue = new String(fieldvalue.getBytes("iso-8859-1"),"utf-8");System.out.println(fieldname + "=" + fieldvalue);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return new String[]{fieldname,fieldvalue};}// 上传表单项private static String[] processUploadField(FileItem fileitem, String type) {HttpServletRequest request = ServletActionContext.getRequest();ServletContext servletContext = ServletActionContext.getServletContext();String lastf = "";String fieldName = "";try {// 得到文件输入流//InputStream is = request.getInputStream();// 创建一个文件存盘的目录String directoryRealPath = servletContext.getRealPath("/upload");//测试用File storeDirectory = new File(directoryRealPath);// 即代表文件又代表目录if (!storeDirectory.exists()) {boolean b = storeDirectory.mkdirs();// 创建一个指定的目录}// 得到上传的名子String filename = fileitem.getName();System.out.println("filename"+filename);if (filename != null && !(filename.isEmpty())) {// filename =// filename.substring(filename.lastIndexOf(File.separator)+1);filename = FilenameUtils.getName(filename);// 效果同上}// 解决文件同名的问题filename = UUID.randomUUID() + "_" + filename;// 目录打散// String childDirectory = makeChildDirectory(storeDirectory); //// 2015-10-19String childDirectory = makeChildDirectory(storeDirectory, filename); // a/bSystem.out.println(3333);System.out.println(storeDirectory + childDirectory+ File.separator + filename);File lastfile  = new File(storeDirectory, childDirectory + File.separator + filename);lastf = lastfile.toString();lastf = lastf.replaceAll("\\\\", "/");//把地址的反斜线转换成斜线int index = lastf.lastIndexOf("upload");lastf = lastf.substring(index);// 得到字段名fieldName = fileitem.getFieldName();if(!(type == null || type.isEmpty())){fieldName = type;}// 上传文件,自动删除临时文件fileitem.write(lastfile);fileitem.delete();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return new String[]{fieldName,lastf};}// 上传表单项 头像private static String[] processUploadField(FileItem fileitem, String type, String id ) {HttpServletRequest request = ServletActionContext.getRequest();ServletContext servletContext = ServletActionContext.getServletContext();String lastf = "";String fieldName = "";try {// 得到文件输入流//InputStream is = request.getInputStream();// 创建一个文件存盘的目录//String directoryRealPath = servletContext.getRealPath("/upload/data/avatar");//测试用File storeDirectory = new File(directoryRealPath);// 即代表文件又代表目录if (!storeDirectory.exists()) {boolean b = storeDirectory.mkdirs();// 创建一个指定的目录}StringBuffer zid = new StringBuffer(id);int length = id.length();for(int i = 0 ;i<10-length ; i++){zid = zid.insert(0, "0");}StringBuffer insert = zid.insert(3, "/").insert(7, "/").insert(10, "/");String endstr = insert.toString();String folder = insert.substring(0, insert.length()-2);File file = new File(directoryRealPath,folder);if (!file.exists()) {boolean b = file.mkdirs();// 创建一个指定的目录}String zzid = endstr+"_avatar.jpg";File lastfile  = new File(storeDirectory, zzid);lastf = lastfile.toString();lastf = lastf.replaceAll("\\\\", "/");//把地址的反斜线转换成斜线int index = lastf.lastIndexOf("upload");lastf = lastf.substring(index);System.out.println(lastf+"-------");// 得到字段名fieldName = fileitem.getFieldName();if(!(type == null || type.isEmpty())){fieldName = type;}// 上传文件,自动删除临时文件fileitem.write(lastfile);fileitem.delete();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return new String[]{fieldName,lastf};}// 上传表单项通过iosprivate static String[] processUploadFieldByIOS(FileItem fileitem) {HttpServletRequest request = ServletActionContext.getRequest();ServletContext servletContext = ServletActionContext.getServletContext();String lastf = "";String fieldName = "";try {// 得到文件输入流//InputStream is = request.getInputStream();// 创建一个文件存盘的目录String directoryRealPath = servletContext.getRealPath("/upload");//这种方式项目重新部署之后上传的文件会被删除File storeDirectory = new File(directoryRealPath);// 即代表文件又代表目录if (!storeDirectory.exists()) {boolean b = storeDirectory.mkdirs();// 创建一个指定的目录}// 得到上传的名子String filename = fileitem.getName();System.out.println("filename"+filename);if (filename != null) {// filename =// filename.substring(filename.lastIndexOf(File.separator)+1);filename = FilenameUtils.getName(filename);// 效果同上}// 解决文件同名的问题filename = UUID.randomUUID() + "_" + filename;// 目录打散// String childDirectory = makeChildDirectory(storeDirectory); //// 2015-10-19String childDirectory = makeChildDirectory(storeDirectory, filename); // a/bSystem.out.println(3333);System.out.println(storeDirectory + childDirectory+ File.separator + filename);File lastfile  = new File(storeDirectory, childDirectory + File.separator + filename);lastf = lastfile.toString();lastf = lastf.replaceAll("\\\\", "/");//把地址的反斜线转换成斜线int index = lastf.lastIndexOf("upload");lastf = lastf.substring(index);System.out.println(lastf+"-------");// 得到字段名//fieldName = fileitem.getFieldName();fieldName = "image";// 上传文件,自动删除临时文件fileitem.write(lastfile);fileitem.delete();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return new String[]{fieldName,lastf};}// 目录打散private static String makeChildDirectory(File storeDirectory, String filename) {int hashcode = filename.hashCode();// 返回字符转换的32位hashcode码System.out.println(hashcode);String code = Integer.toHexString(hashcode); // 把hashcode转换为16进制的字符// abdsaf2131safsdSystem.out.println(code);String childDirectory = code.charAt(0) + "/"+ code.charAt(1); // a/b// 创建指定目录File file = new File(storeDirectory, childDirectory);if (!file.exists()) {file.mkdirs();}return childDirectory;}// 上传表单项private static String[] processUploadFieldCrossServer(FileItem fileitem) {String lastf = "";String fieldName = "";try {// 得到文件输入流InputStream is = fileitem.getInputStream();// 得到字段名fieldName = fileitem.getFieldName();// 得到上传的名子String filename = fileitem.getName();// 处理文件名if (filename != null) {// filename =// filename.substring(filename.lastIndexOf(File.separator)+1);filename = FilenameUtils.getName(filename);// 效果同上}// 解决文件同名的问题filename = UUID.randomUUID() + "_" + filename;String host = "http://127.0.0.1:8081/image_zho";//创建jesy服务器,进行跨服务器上传Client client = Client.create();lastf = host+"/upload/"+filename;//把文件关联到远程服务器// 在storeDirectory下,创建完整目录下的文件WebResource resource = client.resource(host+"/upload/"+filename);// 绝对目录/日期目录/文件名//上传resource.put(String.class, is);is.close();fileitem.delete();} catch (IOException e) {e.printStackTrace();}return new String[]{fieldName,lastf};} }
注:跨服务器上传需要引入修改图片服务器文件上传权限,并且需要导入jersey-core  jar包和jersey-client  jar包。





先 的

阅读全文
1 0
原创粉丝点击