JSP文件下载-----------------------------------------------------------------
<%@ page contentType="text/html; charset=GBK"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ page import="java.io.File"%> <%@page import="java.io.InputStream"%> <%@page import="java.io.FileInputStream"%> <% String path = request.getParameter("path") ; if(path==null || "".equals(path)){ out.write("<script type="text/javascript"><!-- ") ; out.write("alert('要下载的文件不存在');") ; out.write("history.go(-1);") ; out.write(" // --><script>") ; } String realPath = "c:/myfile/正文.doc" ; File file = new File(realPath) ; if(!file.exists()){ out.write("<mce:script type="text/javascript"><!-- ") ; out.write("alert('要下载的文件不存在');") ; out.write("history.go(-1);") ; out.write(" // --></mce:script>") ; }else{ long l = file.length() ; InputStream in = new FileInputStream(file) ; String fs = file.getName() ; if(in!=null){ response.reset(); response.setContentType("application/x-msdownload"); response.setHeader("Content-disposition","attachment; filename="+new String(fs.getBytes("GBK"),"iso8859-1")); //以上输出文件元信息 response.setContentLength((int)l); //设置输入文件长度 byte[] b = new byte[2048]; int len = 0; while((len=in.read(b)) >0) response.getOutputStream().write(b,0,len); //向浏览器输出 in.close(); //关闭文件输入流 response.flushBuffer(); out.clear(); out = pageContext.pushBody(); } } %>
文件上传----------------------------------------------------------------------
提交页面-------------
<form method="POST" enctype="multipart/form-data" action="--WEBBOT-SELF--"> <input type="file" name="F1" size="20"> <input type="text" name="username" size="20"> <input type="submit" value="提交" name="B1"> <input type="reset" value="重置" name="B2"></p> </form>
action页面-----------
<% my.file.UploadFile f = new UploadFile(); f.upLoad(request); //上传 f.getParameter("username"); //获取提交的参数 %>
类文件------------
package my.file; import javax.servlet.http.HttpServletRequest; import java.io.*; import java.util.HashMap; /** * 文件上传 * 采用byte解析,只能上传单个文件,支持传递文件的同时,url参数 * @author 胡晶 * @version 1.0 * @date 2009-9-9 * @class_displayName UploadFile */ public class UploadFile { public static final int MAX_SIZE = 1024 * 1024 * 100; public static String FILE_DIR = "c:/"; private int file_Size = 0; private String file_Path = ""; private HashMap hm = new HashMap(); public String upLoad(HttpServletRequest req) { String tmpString = ""; String result = ""; DataInputStream dis = null; FILE_DIR = req.getContextPath(); System.out.println("FILE_DIR==="+FILE_DIR); try { dis = new DataInputStream(req.getInputStream()); String content = req.getContentType(); if (content != null && content.indexOf("multipart/form-data") != -1) { int reqSize = req.getContentLength(); byte[] data = new byte[reqSize]; int bytesRead = 0; int totalBytesRead = 0; int sizeCheck = 0; while (totalBytesRead < reqSize) { // check for maximum file size violation sizeCheck = totalBytesRead + dis.available(); if (sizeCheck > MAX_SIZE) result = "文件太大不能上传..."; bytesRead = dis.read(data, totalBytesRead, reqSize); totalBytesRead += bytesRead; } tmpString = new String(data); hm = parseAnotherParam(tmpString); // System.out.println("src datatmp |"+new String(data)+"|"); int postion = arrayIndexOf(data, "/r/n".getBytes()); byte[] split_arr = new byte[postion]; System.arraycopy(data, 0, split_arr, 0, postion); // System.out.println("split |"+new String(split_arr)+"|"); postion = arrayIndexOf(data, "filename=/"".getBytes()); byte[] dataTmp = new byte[data.length - postion]; System.arraycopy(data, postion, dataTmp, 0, dataTmp.length); data = null; data = dataTmp.clone(); String filePath = null; postion = arrayIndexOf(data, "Content-Type:".getBytes()) - 2; dataTmp = null; dataTmp = new byte[postion]; System.arraycopy(data, 0, dataTmp, 0, dataTmp.length); filePath = new String(dataTmp); if (filePath == null && filePath.equals("")) return ""; // System.out.println("filename |"+filePath+"|"); // 分离contentType 并赋值 postion = arrayIndexOf(data, "Content-Type:".getBytes()); dataTmp = null; dataTmp = new byte[data.length - postion]; System.arraycopy(data, postion, dataTmp, 0, dataTmp.length); data = null; data = dataTmp.clone(); // System.out.println("src adatatmp |"+new String(data)+"|"); postion = arrayIndexOf(data, "/n".getBytes()) + 1; dataTmp = null; dataTmp = new byte[data.length - postion]; System.arraycopy(data, postion, dataTmp, 0, dataTmp.length); data = null; data = dataTmp.clone(); // System.out.println("datatmp |"+new String(data)+"|"); // 分离文件信息 获得最终想要的字节 postion = arrayIndexOf(data, split_arr); split_arr = null; dataTmp = null; dataTmp = new byte[postion - 2]; System.arraycopy(data, 2, dataTmp, 0, dataTmp.length); data = null; data = dataTmp.clone(); // System.out.println("datatmp |"+new String(data)+"|"); postion = arrayLastIndexOf(data, "/n".getBytes()) - 1; dataTmp = null; dataTmp = new byte[postion]; // System.out.println("postion:"+postion + " datalength:"+ // data.length +" tmplength:" + dataTmp.length); System.arraycopy(data, 0, dataTmp, 0, dataTmp.length); data = null; // System.out.println("data |"+new String(dataTmp)+"|"); String file_path = getFileName(filePath); // System.out.println("file_path:"+file_path); if (null != file_path) { if (writeFile(dataTmp, FILE_DIR + file_path)) { this.file_Size = dataTmp.length; this.file_Path = FILE_DIR + file_path; result = "文件上传完毕"; } else { result = "文件上传失败"; } } else { result = "文件名为空"; } dataTmp = null; } else { result = "content 必须为 multipart/form-data"; } } catch (UnsupportedEncodingException ex4) { result = "UnsupportedEncodingException错误"; } catch (NullPointerException e) { result = "NullPointerException错误"; } catch (IOException ex1) { result = "IOException 错误 "; } catch (Exception ex1) { result = "Exception 错误 "; } return result; } public String getFilePath() { return this.file_Path; } public int getFileSize() { return this.file_Size; } public boolean writeFile(byte[] data, String path) { File f = null; FileOutputStream fos = null; try { f = new File(path); f.createNewFile(); fos = new FileOutputStream(f); fos.write(data, 0, data.length); } catch (FileNotFoundException e) { return false; } catch (IOException e) { return false; } finally { try { fos.close(); } catch (IOException e) { return false; } } return true; } public String getFileName(String arg) { String path = ""; if (arg.equals("/"/"")) { return null; } if (arg.indexOf("/"") > -1) path = arg.substring(arg.indexOf("/"") + 1, arg.lastIndexOf("/"")); else path = arg; // System.out.println("file_path:"+arg); path = path.substring(path.lastIndexOf("//") + 1); return path; } // 判断两个byte数组的值是否相等 private boolean arrayEquals(byte[] src, byte[] value) { if (src == null || value == null) return false; if (src.length != value.length) return false; for (int i = 0; i < src.length; i++) { if (src[i] != value[i]) return false; } return true; } // 找出value数组在src中的位置, 从前往后 private int arrayIndexOf(byte[] src, byte[] value) { if (src == null || value == null) return -1; if (src.length < value.length) return -1; int postion = -1; for (int i = 0; i < src.length - value.length; i++) { postion = i; byte[] tmp = new byte[value.length]; System.arraycopy(src, i, tmp, 0, tmp.length); if (arrayEquals(tmp, value)) { tmp = null; return postion; } else { postion = -1; tmp = null; } } return postion; } // 找出value数组在src中的位置 private int arrayLastIndexOf(byte[] src, byte[] value) { if (src == null || value == null) return -1; if (src.length < value.length) return -1; int postion = -1; for (int i = src.length - value.length; i > -1; i--) { postion = i; byte[] tmp = new byte[value.length]; System.arraycopy(src, i, tmp, 0, tmp.length); // System.out.println(i); // Common.PrintDataHex(tmp, " "); // Common.PrintDataHex(value, " "); if (arrayEquals(tmp, value)) { tmp = null; return postion; } else { postion = -1; tmp = null; } } // System.out.println("debug"); return postion; } public HashMap parseAnotherParam(String str) { HashMap<String, String> hm = new HashMap<String, String>(); String key = ""; String value = ""; int startindex = 0; int endindex = 0; startindex = str.indexOf("Content-Disposition: form-data; name=/"") + "Content-Disposition: form-data; name=/"".length(); endindex = str.indexOf("/"/r/n/r/n"); while (startindex > -1 && endindex > -1) { key = str.substring(startindex, endindex); if (!str.substring(endindex, endindex + 5).equals("/"/r/n/r/n")) {// 去掉没有value的元素 str = str.substring(endindex); startindex = str .indexOf("Content-Disposition: form-data; name=/"") + "Content-Disposition: form-data; name=/"".length(); endindex = str.indexOf("/"/r/n/r/n"); continue; } if (key.indexOf("/";") > -1) {// 去掉上传文件的参数以及编码 str = str.substring(str.indexOf("/";") + 2); startindex = str .indexOf("Content-Disposition: form-data; name=/"") + "Content-Disposition: form-data; name=/"".length(); endindex = str.indexOf("/"/r/n/r/n"); continue; } else str = str.substring(endindex + 5); value = str.substring(0, str.indexOf("/r/n")); str = str.substring(str.indexOf("/r/n") + 2); // System.out.println("key:"+key+" value:"+value); hm.put(key, value); startindex = str.indexOf("Content-Disposition: form-data; name=/"") + "Content-Disposition: form-data; name=/"".length(); endindex = str.indexOf("/"/r/n/r/n"); } return hm; } public String getParameter(String param) { // System.out.println(hm.toString()); return (String) hm.get(param); } }