posts - 7, comments - 2, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Java 文件上传

Posted on 2007-09-24 22:59 卓韦 阅读(8651) 评论(1)  编辑  收藏

java文件上传,介绍几种常用的方法,也是经过本人亲手调试过的
1.jspsmartupload
这个组件用起来是挺方便的,不过就是只适合小文件上传,如果大文件上传的话就不行,查看了一下他的代码,m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes];居然把整个上传文件都读到内存去了,那如果是上传几十M的文件,同时几个用户上传,服务器稳挂,不过如果只是上传5M以内的小文件,这个组件还是挺实用的

下面是源代码:
File类
/*
 * 创建日期 2006-7-29
 *
 * 更改所生成文件模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
package com.kinstar.issuing.file;

/**
 * @author gongyifeng
 *
 * 更改所生成类型注释的模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;

// Referenced classes of package com.jspsmart.upload:
// SmartUploadException, SmartUpload

public class File{
 private SmartUpload m_parent;
 private int m_startData;
 private int m_endData;
 private int m_size;
 private String m_fieldname;
 private String m_filename;
 private String m_fileExt;
 private String m_filePathName;
 private String m_contentType;
 private String m_contentDisp;
 private String m_typeMime;
 private String m_subTypeMime;
 private String m_contentString;
 private boolean m_isMissing;
 public static final int SAVEAS_AUTO = 0;
 public static final int SAVEAS_VIRTUAL = 1;
 public static final int SAVEAS_PHYSICAL = 2;

 File(){
  m_startData = 0;
  m_endData = 0;
  m_size = 0;
  m_fieldname = new String();
  m_filename = new String();
  m_fileExt = new String();
  m_filePathName = new String();
  m_contentType = new String();
  m_contentDisp = new String();
  m_typeMime = new String();
  m_subTypeMime = new String();
  m_contentString = new String();
  m_isMissing = true;
 }

 public void saveAs(String s) throws IOException, SmartUploadException{
  saveAs(s, 0);
 }

 public void saveAs(String s, int i) throws IOException, SmartUploadException{
  String s1 = new String();
  s1 = m_parent.getPhysicalPath(s, i);
  if(s1 == null)
   throw new IllegalArgumentException("There is no specified destination file (1140).");
  try
  {
   java.io.File file = new java.io.File(s1);
   FileOutputStream fileoutputstream = new FileOutputStream(file);
   fileoutputstream.write(m_parent.m_binArray, m_startData, m_size);
   fileoutputstream.close();
  }
  catch(IOException ioexception)
  {
   throw new SmartUploadException("File can't be saved (1120).");
  }
 }

 public void fileToField(ResultSet resultset, String s) throws ServletException, IOException, SmartUploadException, SQLException{
  long l = 0L;
  int i = 0x10000;
  int j = 0;
  int k = m_startData;
  if(resultset == null)
   throw new IllegalArgumentException("The RecordSet cannot be null (1145).");
  if(s == null)
   throw new IllegalArgumentException("The columnName cannot be null (1150).");
  if(s.length() == 0)
   throw new IllegalArgumentException("The columnName cannot be empty (1155).");
  l = BigInteger.valueOf(m_size).divide(BigInteger.valueOf(i)).longValue();
  j = BigInteger.valueOf(m_size).mod(BigInteger.valueOf(i)).intValue();
  try
  {
   for(int i1 = 1; (long)i1 < l; i1++)
   {
    resultset.updateBinaryStream(s, new ByteArrayInputStream(m_parent.m_binArray, k, i), i);
    k = k != 0 ? k : 1;
    k = i1 * i + m_startData;
   }
   
   if(j > 0)
    resultset.updateBinaryStream(s, new ByteArrayInputStream(m_parent.m_binArray, k, j), j);
  }catch(SQLException sqlexception){
   byte abyte0[] = new byte[m_size];
   System.arraycopy(m_parent.m_binArray, m_startData, abyte0, 0, m_size);
   resultset.updateBytes(s, abyte0);
  }catch(Exception exception)
  {
   throw new SmartUploadException("Unable to save file in the DataBase (1130).");
  }
 }

 public boolean isMissing(){
  return m_isMissing;
 }
 
 public String getFieldName(){
  return m_fieldname;
 }
 
 public String getFileName(){
  DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
  String date = df.format(new Date());
  
  return date+m_filename;
 }
 
 public String getFilePathName(){
  return m_filePathName;
 }
 
 public String getFileExt(){
  return m_fileExt;
 }
 
 public String getContentType(){
  return m_contentType;
 }
 
 public String getContentDisp(){
  return m_contentDisp;
 }
 
 public String getContentString(){
  String s = new String(m_parent.m_binArray, m_startData, m_size);
  return s;
 }
 
 public String getTypeMIME() throws IOException{
  return m_typeMime;
 }
 
 public String getSubTypeMIME(){
  return m_subTypeMime;
 }
 
 public int getSize(){
  return m_size;
 }
 
 protected int getStartData(){
  return m_startData;
 }
 
 protected int getEndData(){
  return m_endData;
 }
 
 protected void setParent(SmartUpload smartupload){
  m_parent = smartupload;
 }
 
 protected void setStartData(int i){
  m_startData = i;
 }
 
 protected void setEndData(int i){
  m_endData = i;
 }
 
 protected void setSize(int i){
  m_size = i;
 }
 
 protected void setIsMissing(boolean flag){
  m_isMissing = flag;
 }
 
 protected void setFieldName(String s){
  m_fieldname = s;
 }
 
 protected void setFileName(String s){
  m_filename = s;
 }
 
 protected void setFilePathName(String s){
  m_filePathName = s;
 }
 
 protected void setFileExt(String s){
  m_fileExt = s;
 }
 
 protected void setContentType(String s){
  m_contentType = s;
 }
 
 protected void setContentDisp(String s){
  m_contentDisp = s;
 }
 
 protected void setTypeMIME(String s){
  m_typeMime = s;
 }
 
 protected void setSubTypeMIME(String s){
  m_subTypeMime = s;
 }
 
 public byte getBinaryData(int i){
  if(m_startData + i > m_endData)
   throw new ArrayIndexOutOfBoundsException("Index Out of range (1115).");
  if(m_startData + i <= m_endData)
   return m_parent.m_binArray[m_startData + i];
  else
   return 0;
 } 
}

Files类
/*
 * 创建日期 2006-7-29
 *
 * 更改所生成文件模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
package com.kinstar.issuing.file;

/**
 * @author gongyifeng
 *
 * 更改所生成类型注释的模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
import java.io.IOException;
import java.util.*;

// Referenced classes of package com.jspsmart.upload:
// File, SmartUpload

public class Files{

 private SmartUpload m_parent;
 private Hashtable m_files;
 private int m_counter;
 
 Files(){
  m_files = new Hashtable();
  m_counter = 0;
 }
 
 protected void addFile(File file){
  if(file == null)
  {
   throw new IllegalArgumentException("newFile cannot be null.");
  } else {
   m_files.put(new Integer(m_counter), file);
   m_counter++;
   return;
  }
 }
 
 public File getFile(int i)
 {
 if(i < 0)
  throw new IllegalArgumentException("File's index cannot be a negative value (1210).");
 File file = (File)m_files.get(new Integer(i));
 if(file == null)
  throw new IllegalArgumentException("Files' name is invalid or does not exist (1205).");
 else
  return file;
 }
 
 public int getCount()
 {
  return m_counter;
 }
 
 public long getSize() throws IOException
 {
  long l = 0L;
  for(int i = 0; i < m_counter; i++)
  l += getFile(i).getSize();
  
  return l;
 }
 
 public Collection getCollection()
 {
  return m_files.values();
 }
 
 public Enumeration getEnumeration()
 {
  return m_files.elements();
 }
}

Request类
/*
 * 创建日期 2006-7-29
 *
 * 更改所生成文件模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
package com.kinstar.issuing.file;

/**
 * @author gongyifeng
 *
 * 更改所生成类型注释的模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
import java.util.Enumeration;
import java.util.Hashtable;

public class Request
{

 private Hashtable m_parameters;
 private int m_counter;
 
 Request(){
  m_parameters = new Hashtable();
  m_counter = 0;
 }
 
 protected void putParameter(String s, String s1) {
  if(s == null)
   throw new IllegalArgumentException("The name of an element cannot be null.");
  if(m_parameters.containsKey(s))
  {
   Hashtable hashtable = (Hashtable)m_parameters.get(s);
   hashtable.put(new Integer(hashtable.size()), s1);
  } else{
   Hashtable hashtable1 = new Hashtable();
   hashtable1.put(new Integer(0), s1);
   m_parameters.put(s, hashtable1);
   m_counter++;
  }
 }
 
 public String getParameter(String s){
 if(s == null)
  throw new IllegalArgumentException("Form's name is invalid or does not exist (1305).");
 Hashtable hashtable = (Hashtable)m_parameters.get(s);
 if(hashtable == null)
  return null;
 else
  return (String)hashtable.get(new Integer(0));
 }
 
 public Enumeration getParameterNames()
 {
  return m_parameters.keys();
 }
 
 public String[] getParameterValues(String s)
 {
  if(s == null)
   throw new IllegalArgumentException("Form's name is invalid or does not exist (1305).");
  Hashtable hashtable = (Hashtable)m_parameters.get(s);
  if(hashtable == null)
   return null;
  String as[] = new String[hashtable.size()];
  for(int i = 0; i < hashtable.size(); i++)
   as[i] = (String)hashtable.get(new Integer(i));
  
  return as;
 }
}

SmartUpload类
/*
 * 创建日期 2006-7-29
 *
 * 更改所生成文件模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
package com.kinstar.issuing.file;

/**
 * @author gongyifeng
 *
 * 更改所生成类型注释的模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
import java.io.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;

// Referenced classes of package com.jspsmart.upload:
// Files, Request, SmartUploadException, File

public class SmartUpload
{

 protected byte m_binArray[];
 protected HttpServletRequest m_request;
 protected HttpServletResponse m_response;
 protected ServletContext m_application;
 private int m_totalBytes;
 private int m_currentIndex;
 private int m_startData;
 private int m_endData;
 private String m_boundary;
 private long m_totalMaxFileSize;
 private long m_maxFileSize;
 private Vector m_deniedFilesList;
 private Vector m_allowedFilesList;
 private boolean m_denyPhysicalPath;
 private boolean m_forcePhysicalPath;
 private String m_contentDisposition;
 public static final int SAVE_AUTO = 0;
 public static final int SAVE_VIRTUAL = 1;
 public static final int SAVE_PHYSICAL = 2;
 private Files m_files;
 private Request m_formRequest;
 
 public SmartUpload()
 {
  m_totalBytes = 0;
  m_currentIndex = 0;
  m_startData = 0;
  m_endData = 0;
  m_boundary = new String();
  m_totalMaxFileSize = 0L;
  m_maxFileSize = 0L;
  m_deniedFilesList = new Vector();
  m_allowedFilesList = new Vector();
  m_denyPhysicalPath = false;
  m_forcePhysicalPath = false;
  m_contentDisposition = new String();
  m_files = new Files();
  m_formRequest = new Request();
 }
 
 public final void init(ServletConfig servletconfig) throws ServletException
 {
  m_application = servletconfig.getServletContext();
 }
 
 public void service(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)throws ServletException, IOException
 {
  m_request = httpservletrequest;
  m_response = httpservletresponse;
 }
 
 public final void initialize(ServletConfig servletconfig, HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)throws ServletException
 {
  m_application = servletconfig.getServletContext();
  m_request = httpservletrequest;
  m_response = httpservletresponse;
 }
 
 public final void initialize(PageContext pagecontext)throws ServletException
 {
  m_application = pagecontext.getServletContext();
  m_request = (HttpServletRequest)pagecontext.getRequest();
  m_response = (HttpServletResponse)pagecontext.getResponse();
 }
 
 public final void initialize(ServletContext servletcontext, HttpSession httpsession, HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse, JspWriter jspwriter) throws ServletException
 {
  m_application = servletcontext;
  m_request = httpservletrequest;
  m_response = httpservletresponse;
 }
 
 public void upload()throws ServletException, IOException, SmartUploadException
 {
  int i = 0;
  boolean flag = false;
  long l = 0L;
  boolean flag1 = false;
  String s = new String();
  String s2 = new String();
  String s4 = new String();
  String s5 = new String();
  String s6 = new String();
  String s7 = new String();
  String s8 = new String();
  String s9 = new String();
  String s10 = new String();
  boolean flag2 = false;
  m_totalBytes = m_request.getContentLength();
  m_binArray = new byte[m_totalBytes];
  int j;
  for(; i < m_totalBytes; i += j)
  try
  {
   m_request.getInputStream();
   j = m_request.getInputStream().read(m_binArray, i, m_totalBytes - i);
  }
  catch(Exception exception)
  {
   throw new SmartUploadException("Unable to upload.");
  }
  
  for(; !flag1 && m_currentIndex < m_totalBytes; m_currentIndex++)
  if(m_binArray[m_currentIndex] == 13)
   flag1 = true;
  else
   m_boundary = m_boundary + (char)m_binArray[m_currentIndex];
  
  if(m_currentIndex == 1)
   return;
  for(m_currentIndex++; m_currentIndex < m_totalBytes; m_currentIndex = m_currentIndex + 2)
  {
   String s1 = getDataHeader();
   m_currentIndex = m_currentIndex + 2;
   boolean flag3 = s1.indexOf("filename") > 0;
   String s3 = getDataFieldValue(s1, "name");
   if(flag3)
   {
    s6 = getDataFieldValue(s1, "filename");
    s4 = getFileName(s6);
    s5 = getFileExt(s4);
    s7 = getContentType(s1);
    s8 = getContentDisp(s1);
    s9 = getTypeMIME(s7);
    s10 = getSubTypeMIME(s7);
   }
   getDataSection();
   if(flag3 && s4.length() > 0)
   {
    if(m_deniedFilesList.contains(s5))
     throw new SecurityException("The extension of the file is denied to be uploaded (1015).");
    if(!m_allowedFilesList.isEmpty() && !m_allowedFilesList.contains(s5))
     throw new SecurityException("The extension of the file is not allowed to be uploaded (1010).");
    if(m_maxFileSize > 0L && (long)((m_endData - m_startData) + 1) > m_maxFileSize)
     throw new SecurityException("Size exceeded for this file : " + s4 + " (1105).");
    l += (m_endData - m_startData) + 1;
    if(m_totalMaxFileSize > 0L && l > m_totalMaxFileSize)
     throw new SecurityException("Total File Size exceeded (1110).");
   }
   if(flag3)
   {
    com.kinstar.issuing.file.File file = new com.kinstar.issuing.file.File();
    file.setParent(this);
    file.setFieldName(s3);
    file.setFileName(s4);
    file.setFileExt(s5);
    file.setFilePathName(s6);
    file.setIsMissing(s6.length() == 0);
    file.setContentType(s7);
    file.setContentDisp(s8);
    file.setTypeMIME(s9);
    file.setSubTypeMIME(s10);
    if(s7.indexOf("application/x-macbinary") > 0)
     m_startData = m_startData + 128;
     file.setSize((m_endData - m_startData) + 1);
     file.setStartData(m_startData);
     file.setEndData(m_endData);
     m_files.addFile(file);
    } else
    {
     String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1);
     m_formRequest.putParameter(s3, s11);
    }
    if((char)m_binArray[m_currentIndex + 1] == '-')
     break;
    }
 
   }
 
 public int save(String s)throws ServletException, IOException, SmartUploadException
 {
  return save(s, 0);
 }
 
 public int save(String s, int i)throws ServletException, IOException, SmartUploadException
 {
  int j = 0;
  if(s == null)
   s = m_application.getRealPath("/");
  if(s.indexOf("/") != -1)
  {
   if(s.charAt(s.length() - 1) != '/')
    s = s + "/";
   } else
   if(s.charAt(s.length() - 1) != '\\')
    s = s + "\\";
   for(int k = 0; k < m_files.getCount(); k++)
   if(!m_files.getFile(k).isMissing())
   {
   m_files.getFile(k).saveAs(s + m_files.getFile(k).getFileName(), i);
   j++;
  }
 
  return j;
 }
 
 public int getSize()
 {
  return m_totalBytes;
 }
 
 public byte getBinaryData(int i)
 {
  byte byte0;
  try
  {
   byte0 = m_binArray[i];
  }
  catch(Exception exception)
  {
   throw new ArrayIndexOutOfBoundsException("Index out of range (1005).");
  }
  return byte0;
 }
 
 public Files getFiles()
 {
  return m_files;
 }
 
 public Request getRequest()
 {
  return m_formRequest;
 }
 
 public void downloadFile(String s) throws ServletException, IOException, SmartUploadException
 {
  downloadFile(s, null, null);
 }
 
 public void downloadFile(String s, String s1) throws ServletException, IOException, SmartUploadException, SmartUploadException
 {
  downloadFile(s, s1, null);
 }
 
 public void downloadFile(String s, String s1, String s2)throws ServletException, IOException, SmartUploadException
 {
  downloadFile(s, s1, s2, 65000);
 }
 
 public void downloadFile(String s, String s1, String s2, int i)throws ServletException, IOException, SmartUploadException
 {
  if(s == null)
   throw new IllegalArgumentException("File '" + s + "' not found (1040).");
  if(s.equals(""))
   throw new IllegalArgumentException("File '" + s + "' not found (1040).");
  if(!isVirtual(s) && m_denyPhysicalPath)
   throw new SecurityException("Physical path is denied (1035).");
  if(isVirtual(s))
   s = m_application.getRealPath(s);
  java.io.File file = new java.io.File(s);
  FileInputStream fileinputstream = new FileInputStream(file);
  long l = file.length();
  boolean flag = false;
  int k = 0;
  byte abyte0[] = new byte[i];
  if(s1 == null)
   m_response.setContentType("application/x-msdownload");
  else
  if(s1.length() == 0)
   m_response.setContentType("application/x-msdownload");
  else
   m_response.setContentType(s1);
  m_response.setContentLength((int)l);
  m_contentDisposition = m_contentDisposition != null ? m_contentDisposition : "attachment;";
  if(s2 == null)
   m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + getFileName(s));
  else
  if(s2.length() == 0)
   m_response.setHeader("Content-Disposition", m_contentDisposition);
  else
   m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + s2);
  while((long)k < l)
  {
   int j = fileinputstream.read(abyte0, 0, i);
   k += j;
   m_response.getOutputStream().write(abyte0, 0, j);
  }
  fileinputstream.close();
 }
 
 public void downloadField(ResultSet resultset, String s, String s1, String s2) throws ServletException, IOException, SQLException
 {
 if(resultset == null)
  throw new IllegalArgumentException("The RecordSet cannot be null (1045).");
 if(s == null)
  throw new IllegalArgumentException("The columnName cannot be null (1050).");
 if(s.length() == 0)
  throw new IllegalArgumentException("The columnName cannot be empty (1055).");
 byte abyte0[] = resultset.getBytes(s);
 if(s1 == null)
  m_response.setContentType("application/x-msdownload");
 else
 if(s1.length() == 0)
  m_response.setContentType("application/x-msdownload");
 else
  m_response.setContentType(s1);
 m_response.setContentLength(abyte0.length);
 if(s2 == null)
  m_response.setHeader("Content-Disposition", "attachment;");
 else
 if(s2.length() == 0)
  m_response.setHeader("Content-Disposition", "attachment;");
 else
  m_response.setHeader("Content-Disposition", "attachment; filename=" + s2);
 m_response.getOutputStream().write(abyte0, 0, abyte0.length);
 }
 
 public void fieldToFile(ResultSet resultset, String s, String s1)throws ServletException, IOException, SmartUploadException, SQLException
 {
  try
  {
   if(m_application.getRealPath(s1) != null)
   s1 = m_application.getRealPath(s1);
   InputStream inputstream = resultset.getBinaryStream(s);
   FileOutputStream fileoutputstream = new FileOutputStream(s1);
   int i;
   while((i = inputstream.read()) != -1)
    fileoutputstream.write(i);
   fileoutputstream.close();
  }
  catch(Exception exception)
  {
   throw new SmartUploadException("Unable to save file from the DataBase (1020).");
  }
 }
 
 private String getDataFieldValue(String s, String s1)
 {
  String s2 = new String();
  String s3 = new String();
  int i = 0;
  boolean flag = false;
  boolean flag1 = false;
  boolean flag2 = false;
  s2 = s1 + "=" + '"';
  i = s.indexOf(s2);
  if(i > 0)
  {
   int j = i + s2.length();
   int k = j;
   s2 = "\"";
   int l = s.indexOf(s2, j);
   if(k > 0 && l > 0)
   s3 = s.substring(k, l);
  }
  return s3;
 }
 
 private String getFileExt(String s)
 {
  String s1 = new String();
  int i = 0;
  int j = 0;
  if(s == null)
   return null;
  i = s.lastIndexOf(46) + 1;
  j = s.length();
  s1 = s.substring(i, j);
  if(s.lastIndexOf(46) > 0)
   return s1;
  else
  return "";
 }
 
 private String getContentType(String s)
 {
  String s1 = new String();
  String s2 = new String();
  int i = 0;
  boolean flag = false;
  s1 = "Content-Type:";
  i = s.indexOf(s1) + s1.length();
  if(i != -1)
  {
   int j = s.length();
   s2 = s.substring(i, j);
  }
  return s2;
 }
 
 private String getTypeMIME(String s)
 {
  String s1 = new String();
  int i = 0;
  i = s.indexOf("/");
  if(i != -1)
   return s.substring(1, i);
  else
  return s;
 }
 
 private String getSubTypeMIME(String s)
 {
  String s1 = new String();
  int i = 0;
  boolean flag = false;
  i = s.indexOf("/") + 1;
  if(i != -1)
  {
   int j = s.length();
   return s.substring(i, j);
  } else
  {
   return s;
  }
 }
 
 private String getContentDisp(String s)
 {
  String s1 = new String();
  int i = 0;
  int j = 0;
  i = s.indexOf(":") + 1;
  j = s.indexOf(";");
  s1 = s.substring(i, j);
  return s1;
 }
 
 private void getDataSection()
 {
  boolean flag = false;
  String s = new String();
  int i = m_currentIndex;
  int j = 0;
  int k = m_boundary.length();
  m_startData = m_currentIndex;
  m_endData = 0;
  while(i < m_totalBytes)
  if(m_binArray[i] == (byte)m_boundary.charAt(j))
  {
   if(j == k - 1)
   {
    m_endData = ((i - k) + 1) - 3;
    break;
   }
   i++;
   j++;
  } else
  {
   i++;
   j = 0;
  }
  m_currentIndex = m_endData + k + 3;
 }
 
 private String getDataHeader()
 {
  int i = m_currentIndex;
  int j = 0;
  boolean flag = false;
  for(boolean flag1 = false; !flag1;)
  if(m_binArray[m_currentIndex] == 13 && m_binArray[m_currentIndex + 2] == 13)
  {
   flag1 = true;
   j = m_currentIndex - 1;
   m_currentIndex = m_currentIndex + 2;
  } else
  {
   m_currentIndex++;
  }
  
  String s = new String(m_binArray, i, (j - i) + 1);
  return s;
 }
 
 private String getFileName(String s)
 {
  String s1 = new String();
  String s2 = new String();
  int i = 0;
  boolean flag = false;
  boolean flag1 = false;
  boolean flag2 = false;
  i = s.lastIndexOf(47);
  if(i != -1)
   return s.substring(i + 1, s.length());
  i = s.lastIndexOf(92);
  if(i != -1)
   return s.substring(i + 1, s.length());
  else
  return s;
 }
 
 public void setDeniedFilesList(String s) throws ServletException, IOException, SQLException
 {
  String s1 = "";
  if(s != null)
  {
  String s2 = "";
  for(int i = 0; i < s.length(); i++)
  if(s.charAt(i) == ',')
  {
   if(!m_deniedFilesList.contains(s2))
   m_deniedFilesList.addElement(s2);
   s2 = "";
  } else
  {
   s2 = s2 + s.charAt(i);
  }
  
  if(s2 != "")
   m_deniedFilesList.addElement(s2);
  } else
  {
   m_deniedFilesList = null;
  }
 }
 
 public void setAllowedFilesList(String s)
 {
  String s1 = "";
  if(s != null)
  {
   String s2 = "";
   for(int i = 0; i < s.length(); i++)
   if(s.charAt(i) == ',')
   {
    if(!m_allowedFilesList.contains(s2))
    m_allowedFilesList.addElement(s2);
    s2 = "";
   } else
   {
    s2 = s2 + s.charAt(i);
   }
   
   if(s2 != "")
    m_allowedFilesList.addElement(s2);
  } else
  {
   m_allowedFilesList = null;
  }
 }
 
 public void setDenyPhysicalPath(boolean flag)
 {
  m_denyPhysicalPath = flag;
 }
 
 public void setForcePhysicalPath(boolean flag)
 {
  m_forcePhysicalPath = flag;
 }
 
 public void setContentDisposition(String s)
 {
  m_contentDisposition = s;
 }
 
 public void setTotalMaxFileSize(long l)
 {
  m_totalMaxFileSize = l;
 }
 
 public void setMaxFileSize(long l)
 {
  m_maxFileSize = l;
 }
 
 protected String getPhysicalPath(String s, int i)throws IOException
 {
  String s1 = new String();
  String s2 = new String();
  String s3 = new String();
  boolean flag = false;
  s3 = System.getProperty("file.separator");
  if(s == null)
   throw new IllegalArgumentException("There is no specified destination file (1140).");
  if(s.equals(""))
   throw new IllegalArgumentException("There is no specified destination file (1140).");
  if(s.lastIndexOf("\\") >= 0)
  {
   s1 = s.substring(0, s.lastIndexOf("\\"));
   s2 = s.substring(s.lastIndexOf("\\") + 1);
  }
  if(s.lastIndexOf("/") >= 0)
  {
   s1 = s.substring(0, s.lastIndexOf("/"));
   s2 = s.substring(s.lastIndexOf("/") + 1);
  }
  s1 = s1.length() != 0 ? s1 : "/";
  java.io.File file = new java.io.File(s1);
  if(file.exists())
   flag = true;
  if(i == 0)
  {
   if(isVirtual(s1))
   {
    s1 = m_application.getRealPath(s1);
    if(s1.endsWith(s3))
     s1 = s1 + s2;
    else
    s1 = s1 + s3 + s2;
     return s1;
   }
   if(flag)
   {
    if(m_denyPhysicalPath)
     throw new IllegalArgumentException("Physical path is denied (1125).");
    else
     return s;
   } else
   {
    throw new IllegalArgumentException("This path does not exist (1135).");
   }
  }
  if(i == 1)
  {
   if(isVirtual(s1))
   {
    s1 = m_application.getRealPath(s1);
   if(s1.endsWith(s3))
    s1 = s1 + s2;
   else
    s1 = s1 + s3 + s2;
   return s1;
  }
  if(flag)
   throw new IllegalArgumentException("The path is not a virtual path.");
  else
   throw new IllegalArgumentException("This path does not exist (1135).");
  }
  if(i == 2)
  {
   if(flag)
   if(m_denyPhysicalPath)
    throw new IllegalArgumentException("Physical path is denied (1125).");
   else
    return s;
   if(isVirtual(s1))
    throw new IllegalArgumentException("The path is not a physical path.");
   else
   throw new IllegalArgumentException("This path does not exist (1135).");
  } else
  {
   return null;
  }
 }
 
 public void uploadInFile(String s)throws IOException, SmartUploadException
 {
  int i = 0;
  int j = 0;
  boolean flag = false;
  if(s == null)
   throw new IllegalArgumentException("There is no specified destination file (1025).");
  if(s.length() == 0)
   throw new IllegalArgumentException("There is no specified destination file (1025).");
  if(!isVirtual(s) && m_denyPhysicalPath)
   throw new SecurityException("Physical path is denied (1035).");
  i = m_request.getContentLength();
  m_binArray = new byte[i];
  int k;
  for(; j < i; j += k)
  try
  {
   k = m_request.getInputStream().read(m_binArray, j, i - j);
  }
  catch(Exception exception)
  {
   throw new SmartUploadException("Unable to upload.");
  }
  
  if(isVirtual(s))
   s = m_application.getRealPath(s);
  try
  {
   java.io.File file = new java.io.File(s);
   FileOutputStream fileoutputstream = new FileOutputStream(file);
   fileoutputstream.write(m_binArray);
   fileoutputstream.close();
  }
  catch(Exception exception1)
  {
   throw new SmartUploadException("The Form cannot be saved in the specified file (1030).");
  }
 }
 
 private boolean isVirtual(String s)
 {
  if(m_application.getRealPath(s) != null)
  {
   java.io.File file = new java.io.File(m_application.getRealPath(s));
   return file.exists();
  } else
  {
   return false;
  }
 }
}

SmartUploadException 类
/*
 * 创建日期 2006-7-29
 *
 * 更改所生成文件模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
package com.kinstar.issuing.file;

/**
 * @author gongyifeng
 *
 * 更改所生成类型注释的模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
public class SmartUploadException extends Exception
{

 SmartUploadException(String s)
 {
  super(s);
 }
}

上传的Servlet
package com.kinstar.issuing.action;

import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
import java.text.*;
import javax.servlet.*;
import javax.servlet.http.*;


import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.kinstar.issuing.file.File;
import com.kinstar.issuing.file.SmartUpload;
import com.kinstar.issuing.objects.t_user;
import com.kinstar.issuing.operation.UserOperation;
import com.kinstar.issuing.program.programService;
import com.kinstar.issuing.session.SessionGloble;
import com.kinstar.issuing.util.StringUtil;

/**
 * @version  1.0
 * @author gyf
 */


public class upload2ProgramAction extends HttpServlet{
  private ServletConfig config;
  /**
  * 初始化Servlet
  */
  final public void init(ServletConfig config) throws ServletException {
  this.config = config;
  }
  /**
  * 处理GET请求
  */
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   doPost(request,response);
  }
 
  /**
  * 响应POST请求
  */
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
   int count=0;
   SmartUpload mySmartUpload = new SmartUpload();
   try {
     // 初始化
     mySmartUpload.initialize(config,request,response);
 
     // 上载
     mySmartUpload.upload();
     com.kinstar.issuing.file.File f1 = mySmartUpload.getFiles().getFile(0);
   //  com.kinstar.issuing.file.File f2 = mySmartUpload.getFiles().getFile(1);
     String backPic = f1.getFileName();
   //String name2 = f2.getFileName();
   
     long size=0;
     
    // 保存上载文件到指定目录
   count=mySmartUpload.save("ads");  
   response.sendRedirect("program.jsp?dopass=ture");
  
    }     

     
    catch (Exception e){
     response.sendRedirect("fail.jsp");
   } 
}

2.common-fileupload组件
挺好用的,也能够上传大文件,我试过,300M以上的文件上传本地传非常快,异地测试也能够上传成功.
首先要下载org.apache.commons.fileupload包和org.apache.commons.io包

下面是我的servlet
package com.kinstar.issuing.action;

import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
import java.text.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.regex.*;


import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;

import com.kinstar.issuing.objects.t_user;
import com.kinstar.issuing.operation.UserOperation;
import com.kinstar.issuing.program.programService;
import com.kinstar.issuing.session.SessionGloble;
import com.kinstar.issuing.util.StringUtil;

/**
 * @version  1.0
 * @author gyf
 */


public class uploadProgramAction extends HttpServlet{
  private static final String CONTENT_TYPE = "text/html; charset=GB2312";
 
  /**
  * 处理GET请求
  */
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request,response);
  }
 
  /**
  * 响应POST请求
  */
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   // 变量定义
    response.setContentType(CONTENT_TYPE);
    HttpSession modifysession=request.getSession();
    SessionGloble logonUser;
    logonUser=(SessionGloble)modifysession.getAttribute("UserInfo");
       if(logonUser==null){
       response.sendRedirect("mainindex.jsp");
    }
    t_user userinfo=new t_user();
    UserOperation user=null;
    try {
     user = new UserOperation();
    } catch (Exception e1) {
    // TODO 自动生成 catch 块
    e1.printStackTrace();
    }
    try {
     userinfo=user.getUser(logonUser.getUserId());
    } catch (Exception e2) {
    // TODO 自动生成 catch 块
    e2.printStackTrace();
    }
     //System.out.println("figure="+userinfo.getUserFigure());
     PrintWriter out=response.getWriter();
     DateFormat updf = new SimpleDateFormat("yyyyMMddHHmm");
     String updateTime = updf.format(new Date());
     int isNeed = 0;
     String IsCheck="0";
  
    //省农行用户上传的节目必需显示,且审批已经合格
     if(userinfo.getUserFigure().equals("1")){
     isNeed = 1;
     IsCheck = "1";
     }
     else{
     isNeed = 0;
     IsCheck = "0";
     }
    int type=0;
    String avaTime="";
    String screen="";
    int fileTime=0;
    int fileTimeReal=0;
    int circle=0;
    String picSwitch="";
    String deleState="1";
    String backPic="";
   
    String fieldName="";
    String finalName="";
    String fileNameReal="";
    long size=0;
    String name="";
     try {
    DiskFileUpload fu = new DiskFileUpload();
    // 设置允许用户上传文件大小,单位:字节,这里设为2m
    fu.setSizeMax(5*1024*1024*1024);
    // 设置最多只允许在内存中存储的数据,单位:字节
    fu.setSizeThreshold(10*1024*1024);
    // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
    fu.setRepositoryPath("C:\\WINDOWS\\Temp\\");
    //开始读取上传信息
    List fileItems = fu.parseRequest(request);
    //依次处理每个上传的文件
    Iterator iter = fileItems.iterator();
 
  
       //正则匹配,过滤路径取文件名
    String regExp=".+\\\\(.+)$";
 
    //过滤掉的文件类型
    String[] errorType={".exe",".com",".cgi",".asp"};
     
    Pattern p = Pattern.compile(regExp);
    StringUtil su = new StringUtil();
      
    while (iter.hasNext()) {
      FileItem item = (FileItem)iter.next();
    
       if(item.isFormField()) {
       // 获得表单域的名字
        fieldName = item.getFieldName();
        // 如果表单域的名字是name…
        if(fieldName.equals("type"))
            type = Integer.parseInt(item.getString());
      
       }
      if (!item.isFormField()) {
       name = item.getName();
       size = item.getSize();
       if((name==null||name.equals("")) && size==0)
        continue;
        Matcher m = p.matcher(name);
        boolean result = m.find();
        if (result){
        for (int temp=0;temp<errorType.length;temp++){
        if (m.group(1).endsWith(errorType[temp])){
        throw new IOException(name+": wrong type");
        }
        }
      
       DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
                String date = df.format(new Date());
       fileNameReal=date+m.group(1);
       finalName=date+Math.round(Math.random()*10000)+fileNameReal.substring(fileNameReal.indexOf("."));
        //保存上传的文件到指定的目录  
        //在下文中上传文件至数据库时,将对这里改写
        item.write(new File(getServletContext().getRealPath(".//ads//")+finalName));
        //out.print(finalName+size);
        }
       else
       {
      throw new IOException("fail to upload");
      
       } 
      }
      if(item.isFormField()) {
     // 获得表单域的名字
     fieldName = item.getFieldName();
     if(fieldName.equals("avaTime"))
      avaTime=item.getString();
     if(fieldName.equals("screen"))
      screen=item.getString();
     if(fieldName.equals("fileTime"))
      fileTime = Integer.parseInt(item.getString());
     if(fieldName.equals("fileTimeReal"))
      fileTimeReal = Integer.parseInt(item.getString());
     if(fieldName.equals("circle"))
      circle = Integer.parseInt(item.getString()); 
     if(fieldName.equals("switchPic"))
        picSwitch = item.getString(); 
      
      }   
       }
     }catch (IOException e){
       out.println(e);
     }catch (FileUploadException e){
       out.println(e);
     } catch (Exception e) {
    // TODO 自动生成 catch 块
     e.printStackTrace();
     }
     if(finalName.equals("")){
       response.sendRedirect("fail.jsp");
     }
     else{
   try {
    programService ps = new programService();
    ps.insertProgram(userinfo.getUserId(),updateTime,type,finalName,size,isNeed,avaTime,deleState,IsCheck,userinfo.getCity(),backPic,screen,fileTime,fileTimeReal,picSwitch,circle,userinfo.getUserFigure(),new String(fileNameReal.getBytes("GB2312"),"ISO8859-1"));
    response.sendRedirect("program.jsp?dopass=true"); 
   } catch (Exception e3) {
   // TODO 自动生成 catch 块
    e3.printStackTrace();
   }
     }
   }
}


评论

# re: Java 文件上传   回复  更多评论   

2015-11-16 18:27 by luochenxi
sdfsdfsdfsd

只有注册用户登录后才能发表评论。


网站导航: