package com.upload;
import java.io.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.ServletInputStream; import javax.servlet.ServletException;
public class upload{ private static String newline = ""; private String uploadDirectory = "."; private String ContentType = ""; private String CharacterEncoding = "";
private String getFileName(String s){ int i = s.lastIndexOf(""); if(i < 0 // i >= s.length() - 1){ i = s.lastIndexOf("/"); if(i < 0 // i >= s.length() - 1) return s; } return s.substring(i + 1); }
public void setUploadDirectory(String s){ uploadDirectory = s; }
public void setContentType(String s){ ContentType = s; int j; if((j = ContentType.indexOf("boundary=")) != -1){ ContentType = ContentType.substring(j + 9); ContentType = "--" + ContentType; } }
public void setCharacterEncoding(String s){ CharacterEncoding = s; }
public void uploadFile( HttpServletRequest req) throws ServletException, IOException{ setCharacterEncoding(req.getCharacterEncoding()); setContentType(req.getContentType()); uploadFile(req.getInputStream()); }
public void uploadFile( ServletInputStream servletinputstream) throws ServletException, IOException{
String s5 = null; String filename = null; byte Linebyte[] = new byte[4096]; byte outLinebyte[] = new byte[4096]; int ai[] = new int[1]; int ai1[] = new int[1];
String line; //得到文件名 while((line = readLine(Linebyte, ai, servletinputstream, CharacterEncoding)) != null){ int i = line.indexOf("filename="); if(i >= 0){ line = line.substring(i + 10); if((i = line.indexOf(""")) > 0) line = line.substring(0, i); break; } }
filename = line;
if(filename != null && !filename.equals(""")){ filename = getFileName(filename);
String sContentType = readLine(Linebyte, ai, servletinputstream, CharacterEncoding); if(sContentType.indexOf("Content-Type") >= 0) readLine(Linebyte, ai, servletinputstream, CharacterEncoding);
//File(String parent, String child) //Creates a new File instance from a parent pathname string //and a child pathname string. File file = new File(uploadDirectory, filename);
//FileOutputStream(File file) //Creates a file output stream to write to the file represented //by the specified File object. FileOutputStream fileoutputstream = new FileOutputStream(file);
while((sContentType = readLine(Linebyte, ai, servletinputstream, CharacterEncoding)) != null){ if(sContentType.indexOf(ContentType) == 0 && Linebyte[0] == 45) break;
if(s5 != null){ //write(byte[] b, int off, int len) //Writes len bytes from the specified byte array starting //at offset off to this file output stream. fileoutputstream.write(outLinebyte, 0, ai1[0]); fileoutputstream.flush(); } s5 = readLine(outLinebyte, ai1, servletinputstream, CharacterEncoding); if(s5 == null // s5.indexOf(ContentType) == 0 && outLinebyte[0] == 45) break; fileoutputstream.write(Linebyte, 0, ai[0]); fileoutputstream.flush(); }
byte byte0; if(newline.length() == 1) byte0 = 2; else byte0 = 1; if(s5 != null && outLinebyte[0] != 45 && ai1[0] > newline.length() * byte0) fileoutputstream.write(outLinebyte, 0, ai1[0] - newline.length() * byte0); if(sContentType != null && Linebyte[0] != 45 && ai[0] > newline.length() * byte0) fileoutputstream.write(Linebyte, 0, ai[0] - newline.length() * byte0);
fileoutputstream.close(); } }
private String readLine(byte Linebyte[], int ai[], ServletInputStream servletinputstream, String CharacterEncoding){ try{ //readLine(byte[] buffer, int offset, int length) //Reads a line from the POST data. ai[0] = servletinputstream.readLine(Linebyte, 0, Linebyte.length); if(ai[0] == -1) return null; }catch(IOException _ex){ return null; } try{ if(CharacterEncoding == null){ //用缺省的编码方式把给定的byte数组转换为字符串 //String(byte[] bytes, int offset, int length) return new String(Linebyte, 0, ai[0]); }else{ //用给定的编码方式把给定的byte数组转换为字符串 //String(byte[] bytes, int offset, int length, String enc) return new String(Linebyte, 0, ai[0], CharacterEncoding); } }catch(Exception _ex){ return null; } } /* public int readLine(byte[] buffer, int offset, int length) throws java.io.IOException 从POST来的数据中读一行 参数: buffer - buffer to hold the line data offset - offset into the buffer to start length - maximum number of bytes to read. Returns: number of bytes read or -1 on the end of line. */ }
upload.jsp <%@page import="com.upload.upload"%> <% String Dir = "/home/tonywan/upload";
upload upload = new upload(); upload.setUploadDirectory(Dir); upload.uploadFile(request); out.print("<center><font color=red>成功上载文件至" + Dir + "</font></center>"); %>
upload.html <center>File upload test</center>
<table><tr> <form method="post" enctype="multipart/form-data" action="upload.jsp"> <td> <input type=file size=20 name="fname"> </td> <td> <input type=Submit value=Upload> </td> </form> </tr></table> |