框架:Struts2、Spring、MyBatis
需求简介:
[新建页面] 可添加多张图片,只显示一张,添加后显示在页面列表中,可删除,可切换预览。
[编辑页面] 功能同上。
页面设计:
预览图
xxxxx1.jpg 删除
xxxxx2.jpg 删除
添加文件
技术点:
1. 本地图片上传后在jsp页面中预览。js
2.服务器读硬盘文件,显示到jsp。java
3.jsp提交包含文件表单不刷新。easyUI
---------------------------------------------------割不割-----------------------------------------------------------
1. 关键字: FileReader
- INPUT type=file 元素
- 必须为 INPUT type=file 元素指定NAME 标签属性的值。
- FORM 元素 METHOD 标签属性的值必须设置为post。
- FORM 元素 ENCTYPE 标签属性的值必须设置为multipart/form-data。
//要处理上载到服务器的文件,服务器端进程必须可以处理 multipart/form-data 的提交。 //标签属性 value 当文本通过用户输入设置后获取 input 对象的文件名。 //C:\Documents and Settings\Administrator\My Documents\My Pictures\ak.jpg //obj.value 为 C:\fakepath\ak.jpg 虚假路径,文件名正确。
<form name="myform" action="post.do" enctype="multipart/form-data" method="post"> <input type="file" name="file1"/> <input type="submit" value="上传文件"> </form>
var reader = new FileReader(); reader.onload = function(e){ document.getElementById(imgPreviewId).setAttribute("src",e.target.result); } reader.readAsDataURL(fileObj.files[0]);
解读file: obj.file // undefined obj.files // [object FileList] obj.files[0] //[object File] // 一个input支持多个文件 obj.files[0] 包含的信息: webkitRelativePath: lastModifiedDate:Fri Jan 16 2015 16:38:56 GMT+0800 (中国标准时间) name:a1.png type:image/png size:7144 slice:function slice() { [native code] } 2.jsp img 标签设置
<img src="showPic.do" />
3. struts.xml 文件配置
<result name="pic" type="stream"> <param name="inputName">inputStream</param> <param name="contentType">image/jpeg</param> <param name="bufferSize">2048*2048</param> </result>
附:result-types
<result-types> <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/> <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/> <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/> <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/> <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/> <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/> <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/> <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /> </result-types>
4. java action配置
InputStream inputStream; getter ... setter ... public showPic (){ inputstream = ... return "pic" }
5. 让表单(form)成为 ajax 提交的表单(form)
easyUI 插件 Form表单
http://www.jeasyui.net/plugins/166.html
var options = { success: function (dataStr){ ... } } $("#myform").form("submit",options);// 此处options 为json
如返回jsonString 可通过 eval(‘(‘ + dataStr + ‘)‘); 转为json对象
6.关键字:Array
var fileNameArray = new Array();
push(fileName); // 添加元素
pop();//弹出最右一个,即顶部,看作桶,有底
shift(); // 移除数组第一个元素
var array = new Array(); array.push(1); array.push(2); array.push(3); array.pop(); alert(array.join(",")); // 1,2 var array = new Array(); array.push(1); array.push(2); array.push(3); array.shift(); alert(array.join(",")); //2,3
移除元素N
var array = new Array(); array.push("a"); array.push("b"); array.push("c"); array.push("d"); array.splice(array.indexOf("b"),1); alert(array.join(",")); //a,c,d
var array = new Array(); array.push("a"); array.push("b"); array.push("c"); array.push("d"); array.pop(); array.shift(); alert(array.length); //2
7.关键字:file
java.io.File file = ...; file.length(); //long 文件大小
File file = new File(filePath); // 删除返回true ,再次删除返回false,目标文件不存在(路径存在new、file不存在)返回false file.delete();
//文件删除
// 1.已存在文件夹: old
// 2.目标文件夹: new
// 3.mkdir :创建最右单个文件夹,只一个new
// 4.mkdirs:依次创建多个文件夹
// 5.只要有一个new被创建则返回true
// 6.二次执行 mkdir or mkdirs 时,返回false,不创建文件夹。
// 7.mkdir or mkdirs 不能创建file.txt文本文件 ,会生成名为file.txt 的文件夹
// 8.1.方法createNewFile会抛出io异常
// 例如:包含非法字符时:文件名、目录名或卷标语法不正确。
// 例如:路径中存在new时:系统找不到指定的路径。
// 8.2方法createNewFile 二次执行时,返回false,不创建文件。
//----------------------------
File d1 = new File("D:\\old\\new\\new"); d1.mkdir(); // return false 未创建 File d2 = new File("D:\\old\\new\\new"); d2.mkdirs(); // return true 创建成功 File d3 = new File("D:\\old\\new"); d3.mkdir(); // return true 创建成功 File f1 = new File("D:\\old\\new.txt"); try { f1.createNewFile();} catch (IOException e) { e.printStackTrace();}
/** * File -> byte[] * * @param file */ public byte[] file2ByteArray(File file) throws FileNotFoundException,IOException { byte[] buf = null; FileInputStream fis = null; ByteArrayOutputStream baos = null; try { fis = new FileInputStream(file); baos = new ByteArrayOutputStream(1024 * 1024); byte[] b = new byte[1024 * 1024]; int l; while ((l = fis.read(b)) != -1) { baos.write(b, 0, l); } baos.flush(); buf = baos.toByteArray(); } catch (FileNotFoundException e) { //logger.info("文件[" + file + "]未找到!"); throw e; } catch (IOException e) { //logger.info("文件[" + file + "]读写错误!" + e.getMessage()); throw e; } finally { try { if (fis != null) { fis.close(); } if (baos != null) { baos.close(); } } catch (IOException e) { throw e; } } return buf; }
/** * * @param filePath \\user\ * @param fileName file.jpg * @param byteArray * */ public String fileWrite(String filePath, String fileName, byte[] byteArray) { // 目标文件夹 File dir = new File(filePath); // 创建文件夹 dir.mkdirs(); String f = filePath + File.separator + fileName; // 目标文件 File file = new File(f); // 如果文件存在返回 if (file.exists()) { return "文件["+f+"]已存在"; // or // file.delete(); } // 文件输出流 FileOutputStream fos = null; try { // 输出目标 fos = new FileOutputStream(filePath + File.separator + fileName); // 输出 fos.write(byteArray); fos.flush(); } catch (FileNotFoundException e) { return "文件["+f+"]未找到"; } catch (IOException e) { return "文件["+f+"]读写错误"; } finally { try { // 关闭 if(fos!=null){ fos.close(); } } catch (IOException e) { return "文件输出流关闭时异常"; } } return null; }
// 文件复制
fileWrite("D:\\old","new.png",file2ByteArray(new File("D:\\old\\old.png")));
// 文件分割符
//linux 读取文件如果路径中存在反斜杠 \\ ,会不能正常读取。
File.separator
Linux下为 /
Windows 下为 \