说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

从WEB客户端上传文件到WEB服务器上

编辑:说三道四文库 发布时间:2018-06-24 12:04
HTML文档下载 WORD文档下载 PDF文档下载
该怎么实现?说的清楚点。本人是菜鸟!
这是一个上传文件的 JavaBean

import java.io.*; 
import javax.servlet.ServletInputStream; 
import javax.servlet.http.HttpServletRequest; 

public class transfer_multi { 
public String[] sourcefile = new String[255];//源文件名 
public String objectpath = "c:/";//目标文件目录 
public String[] suffix = new String[255];//文件后缀名 
public String[] objectfilename = new String[255];//目标文件名 
public ServletInputStream sis = null;//输入流 
public String[] description = new String[255];//描述状态 
public long size = 100*1024;//限制大小 
private int count = 0;//已传输文件数目 
private byte[] b = new byte[4096];//字节流存放数组 
private boolean successful = true; 

public void setSourcefile(HttpServletRequest request) throws java.io.IOException{ 
sis = request.getInputStream(); 
int a = 0; 
int k = 0; 
String s = ""; 
while((a = sis.readLine(b,0,b.length)) != -1){ 
s = new String(b,0,a); 
if((k = s.indexOf("filename=")) != -1){ 
s = s.substring(k+10); 
k = s.indexOf("""); 
s = s.substring(0,k); 
sourcefile[count] = s; 

k = s.lastIndexOf("."); 
suffix[count] = s.substring(k+1); 
System.out.println(suffix[count]); 
if(canTransfer(count)) transferfile(count); 

if(!successful) break; 


public int getCount(){ 
return count; 

public String[] getSourcefile(){ 
return sourcefile; 


public void setObjectpath(String objectpath){ 
this.objectpath = objectpath; 

public String getObjectpath(){ 
return objectpath; 

private boolean canTransfer(int i){ 
suffix[i] = suffix[i].toLowerCase(); 
//这个是我用来传图片的,各位可以把后缀名改掉或者不要这个条件 
if(sourcefile[i].equals("")||(!suffix[i].equals("gif")&&!suffix[i].equals("jpg")&&!suffix[i].equals("jpeg"))) {description[i]="ERR suffix is wrong";return false;} 
else return true; 

private void transferfile(int i){ 
String x = Long.toString(new java.util.Date().getTime()); 
try{ 
objectfilename[i] = x+"."+suffix[i]; 
FileOutputStream out = new FileOutputStream(objectpath+objectfilename[i]); 
int a = 0; 
int k = 0; 
long hastransfered = 0;//标示已经传输的字节数 
String s = ""; 
while((a = sis.readLine(b,0,b.length)) != -1){ 
s = new String(b,0,a); 
if((k = s.indexOf("Content-Type:")) != -1) break; 

sis.readLine(b,0,b.length); 
while((a = sis.readLine(b,0,b.length)) != -1){ 
s = new String(b,0,a); 
if((b[0]==45)&&(b[1]==45)&&(b[2]==45)&&(b[3]==45)&&(b[4]==45)) break; 
out.write(b,0,a); 
hastransfered+=a; 
if(hastransfered>=size){ 
description[count] = "ERR The file "+sourcefile[count]+" is too large to transfer. The whole process is interrupted."; 
successful = false; 
break; 


if(successful) description[count] = "Right The file "+sourcefile[count]+" has been transfered successfully."; 
++count; 
out.close(); 
if(!successful){ 
sis.close(); 
File tmp = new File(objectpath+objectfilename[count-1]); 
tmp.delete(); 


catch(IOException ioe){ 
description[i]=ioe.toString(); 




public transfer_multi(){ 
//可以在构建器里面构建服务器上传目录,也可以在javabean调用的时候自己构建 
setObjectpath("/home/www/jspvhost4/web/popeyelin/images/"); 

}
还看不明白的话,给另外一个例子


public class UploadServlet extends HttpServlet 

 //default maximum allowable file size is 100k 
 static final int MAX_SIZE = 102400; 
 //instance variables to store root and success message 
 String rootPath, successMessage; 
 /** 
  * init method is called when servlet is initialized. 
  */ 
 public void init(ServletConfig config) throws ServletException 
 { 
  super.init(config); 
  //get path in which to save file 
  rootPath = config.getInitParameter(RootPath); 
  if (rootPath == null) 
  { 
   rootPath = /; 
  } 
  /*Get message to show when upload is complete. Used only if 
   a success redirect page is not supplied.*/ 
  successMessage = config.getInitParameter(SuccessMessage); 
  if (successMessage == null) 
  { 
   successMessage = File upload complete!; 
  } 
 } 
 /** 
  * doPost reads the uploaded data from the request and writes 
  * it to a file. 
  */ 
 public void doPost(HttpServletRequest request, 
  HttpServletResponse response) 
 { 
  ServletOutputStream out=null; 
  DataInputStream in=null; 
  FileOutputStream fileOut=null; 
  try 
  { 
   /*set content type of response and get handle to output 
    stream in case we are unable to redirect client*/ 
   response.setContentType(text/plain); 
   out = response.getOutputStream(); 
  } 
  catch (IOException e) 
  { 
   //print error message to standard out 
   System.out.println(Error getting output stream.); 
   System.out.println(Error description: + e); 
   return; 
  } 
  try 
  { 
   //get content type of client request 
   String contentType = request.getContentType(); 
   //make sure content type is multipart/form-data 
   if(contentType != null && contentType.indexOf( 
    multipart/form-data) != -1) 
   { 
    //open input stream from client to capture upload file 
    in = new DataInputStream(request.getInputStream()); 
    //get length of content data 
    int formDataLength = request.getContentLength(); 
    //allocate a byte array to store content data 
    byte dataBytes[] = new byte[formDataLength]; 
    //read file into byte array 
    int bytesRead = 0; 
    int totalBytesRead = 0; 
    int sizeCheck = 0; 
    while (totalBytesRead < formDataLength) 
    { 
     //check for maximum file size violation 
     sizeCheck = totalBytesRead + in.available(); 
     if (sizeCheck > MAX_SIZE) 
     { 
      out.println(Sorry, file is too large to upload.); 
      return; 
     } 
     bytesRead = in.read(dataBytes, totalBytesRead, 
      formDataLength); 
     totalBytesRead += bytesRead; 
    } 
    //create string from byte array for easy manipulation 
    String file = new String(dataBytes); 
    //since byte array is stored in string, release memory 
    dataBytes = null; 
    /*get boundary value (boundary is a unique string that 
     separates content data)*/ 
    int lastIndex = contentType.lastIndexOf(=); 
    String boundary = contentType.substring(lastIndex+1, 
     contentType.length()); 
    //get Directory web variable from request 
    String directory=; 
    if (file.indexOf(name=\\Directory\\) > 0) 
    { 
     directory = file.substring( 
      file.indexOf(name=\\Directory\\)); 
     //remove carriage return 
     directory = directory.substring( 
      directory.indexOf(\\n)+1); 
     //remove carriage return 
     directory = directory.substring( 
      directory.indexOf(\\n)+1); 
     //get Directory 
     directory = directory.substring(0, 
      directory.indexOf(\\n)-1); 
     /*make sure user didn't select a directory higher in 
      the directory tree*/ 
     if (directory.indexOf(..) > 0) 
     { 
      out.println(Security Error: You can't upload + 
       to a directory higher in the directory tree.); 
      return; 
     } 
    } 
    //get SuccessPage web variable from request 
    String successPage=; 
    if (file.indexOf(name=\\SuccessPage\\) > 0) 
    { 
     successPage = file.substring( 
      file.indexOf(name=\\SuccessPage\\)); 
     //remove carriage return 
     successPage = successPage.substring( 
      successPage.indexOf(\\n)+1); 
     //remove carriage return 
     successPage = successPage.substring( 
      successPage.indexOf(\\n)+1); 
     //get success page 
     successPage = successPage.substring(0, 
      successPage.indexOf(\\n)-1); 
    } 
    //get OverWrite flag web variable from request 
    String overWrite; 
    if (file.indexOf(name=\\OverWrite\\) > 0) 
    { 
     overWrite = file.substring( 
      file.indexOf(name=\\OverWrite\\)); 
     //remove carriage return 
     overWrite = overWrite.substring( 
      overWrite.indexOf(\\n)+1); 
     //remove carriage return 
     overWrite = overWrite.substring( 
      overWrite.indexOf(\\n)+1); 
     //get overwrite flag 
     overWrite = overWrite.substring(0, 
      overWrite.indexOf(\\n)-1); 
    } 
    else 
    { 
     overWrite = false; 
    } 
    //get OverWritePage web variable from request 
    String overWritePage=; 
    if (file.indexOf(name=\\OverWritePage\\) > 0) 
    { 
     overWritePage = file.substring( 
      file.indexOf(name=\\OverWritePage\\)); 
     //remove carriage return 
     overWritePage = overWritePage.substring( 
      overWritePage.indexOf(\\n)+1); 
     //remove carriage return 
     overWritePage = overWritePage.substring( 
      overWritePage.indexOf(\\n)+1); 
     //get overwrite page 
     overWritePage = overWritePage.substring(0, 
      overWritePage.indexOf(\\n)-1); 
    } 
    //get filename of upload file 
    String saveFile = file.substring( 
     file.indexOf(filename=\\)+10); 
    saveFile = saveFile.substring(0, 
     saveFile.indexOf(\\n)); 
    saveFile = saveFile.substring( 
     saveFile.lastIndexOf(\\\\)+1, 
     saveFile.indexOf(\\)); 
    /*remove boundary markers and other multipart/form-data 
     tags from beginning of upload file section*/ 
    int pos; //position in upload file 
    //find position of upload file section of request 
    pos = file.indexOf(filename=\\); 
    //find position of content-disposition line 
    pos = file.indexOf(\\n,pos)+1; 
    //find position of content-type line 
    pos = file.indexOf(\\n,pos)+1; 
    //find position of blank line 
    pos = file.indexOf(\\n,pos)+1; 
    /*find the *** of the next boundary marker 
     (marking the end of the upload file data)*/ 
    int boundaryLocation = file.indexOf(boundary,pos)-4; 
    //upload file lies between pos and boundaryLocation 
    file = file.substring(pos,boundaryLocation); 
    //build the full path of the upload file 
    String fileName = new String(rootPath + directory + 
     saveFile); 
    //create File object to check for existence of file 
    File checkFile = new File(fileName); 
    if (checkFile.exists()) 
    { 
     /*file exists, if OverWrite flag is off, give 
      message and abort*/ 
     if (!overWrite.toLowerCase().equals(true)) 
     { 
      if (overWritePage.equals()) 
      { 
       /*OverWrite HTML page URL not received, respond 
        with generic message*/ 
       out.println(Sorry, file already exists.); 
      } 
      else 
      { 
       //redirect client to OverWrite HTML page 
       response.sendRedirect(overWritePage); 
      } 
      return; 
     } 
    } 
    /*create File object to check for existence of 
     Directory*/ 
    File fileDir = new File(rootPath + directory); 
    if (!fileDir.exists()) 
    { 
     //Directory doesn't exist, create it 
     fileDir.mkdirs(); 
    } 
    //instantiate file output stream 
    fileOut = new FileOutputStream(fileName); 
    //write the string to the file as a byte array 
    fileOut.write(file.getBytes(),0,file.length()); 
    if (successPage.equals()) 
    { 
     /*success HTML page URL not received, respond with 
      generic success message*/ 
     out.println(successMessage); 
     out.println(File written to: + fileName); 
    } 
    else 
    { 
     //redirect client to success HTML page 
     response.sendRedirect(successPage); 
    } 
   } 
   else //request is not multipart/form-data 
   { 
    //send error message to client 
    out.println(Request not multipart/form-data.); 
   } 
  } 
  catch(Exception e) 
  { 
   try 
   { 
    //print error message to standard out 
    System.out.println(Error in doPost: + e); 
    //send error message to client 
    out.println(An unexpected error has occurred.); 
    out.println(Error description: + e); 
   } 
   catch (Exception f) {} 
  } 
  finally 
  { 
   try 
   { 
    fileOut.close(); //close file output stream 
   } 
   catch (Exception f) {} 
   try 
   { 
    in.close(); //close input stream from client 
   } 
   catch (Exception f) {} 
   try 
   { 
    out.close(); //close output stream to client 
   } 
   catch (Exception f) {} 
  } 
 } 
}
3楼。。。楼主是新手,所以你要给代码,同时要给个示例JSP。。。这样他才会懂。。光给JAVA代码,他肯定不懂的。。
OK,这个例子够简单了吧

1、index.html

<html>
<head>
<title>上传图片</title>
</head>
<body>
<form action="do_upload.jsp" method="post" enctype="multipart/form-data"> 
<input type="file" name="Photo">
<input type="submit" value="上传">
</form>
</body>
</html> 

2、使用到的函数和类说明

File类文件和目录路径名的抽象表示形式,

File(parent,child)方法根据 parent 抽象路径名和 child 路径名字符串创建一个新File实例

FileOutputStream文件输出流,InputStream输入流,将输入数据看成一根管道,可以形象的将输入流比喻成管道的入口,而输出流比喻成管道的出口。

read(byte[] b)  从此输入流中将最多 b.length 个字节的数据读入一个字节数组中。read() 从此输入流中读取一个数据字节。

write(int b) 将指定字节写入此文件输出流,write(byte[] b, int off, int len) 将指定字节数组中从偏移量 off 开始的 len 个字节写入此文件输出流。write(byte[] b) 将 b.length 个字节从指定字节数组写入此文件输出流中

Random.readLine()逐行读入,Random.seek(int pos)设置到此文件开头测量到的文件指针偏移量,该位置发生下一个读取和写入操作,Random.getFilePointer()返回此文件当前偏移量,Random.readByte()此方法从该文件的当前文件指针开始读取第一个字节。

java.lang.String.lastIndexOf(char c)返回最后一次出现的指定字符在此字符串中的索引


3、do_upload.jsp

<%@ page contentType="text/html;charset=gb2312" language="java"%>
<%@ page import="java.io.*"%>
<html>
<head>
<meta http-equiv="content-Type" contentType="text/html;charset=gb2312">
<title>上传</title>
</head>
<body>
<%
 try{
  String temp=(String)session.getId();//获得sessionId
  File f1=new File((String)request.getRealPath("photo")+"/",temp);    //获得photo所在的目录,并加上sessionId
  out.println(f1);
  FileOutputStream o=new FileOutputStream(f1);                                 //文件输出流指向上传文件所在路径
  out.println(o);
  InputStream in=request.getInputStream();                                         //从客户端获得文件输入流
  int n;
  byte b[]=new byte[10000000];//设置缓冲数组的大小
  while((n=in.read(b))!=-1){
  o.write(b,0,n);                                                  //将数据从输入流读入到缓冲数组然后再从缓冲数组写入到文件中
  }
  o.close();
  in.close();                                                                                                           //关闭输入流和文件输出流

  RandomAccessFile random=new RandomAccessFile(f1,"r");       //文件随机读取写入流
  int second=1;
  String secondLine=null;
  while(second<=2){
   secondLine=random.readLine();//读入临时文件名
   second++;
  }
  int position=secondLine.lastIndexOf('\\');
  String filename=new String((secondLine.substring(position+1,secondLine.length()-1)).getBytes("iso-8859-1"),
  "gb2312");

                    //去掉临时文件名中的sessionId,获得文件名,并用iso-8859-1编码,避免出现中文乱码问题
  random.seek(0);
  long forthEnPosition=0;
  int forth=1;
  while((n=random.readByte())!=1&&forth<=4){
   if(n=='\n'){
    forthEnPosition=random.getFilePointer();
    forth++;
   }//去掉临时文件开头的4个'\n'字符
  }
  File f2=new File((String)request.getRealPath("photo")+"/",filename);

                                                                                                    //以文件的名创建另一个文件随机读取
  RandomAccessFile random2=new RandomAccessFile(f2,"rw");

                                                                                                 //以文件的名创建另一个文件随机读取写入流
  random.seek(random.length());
  long endPosition=random.getFilePointer();
  int j=1;
  long mark=endPosition;
  while(mark<=0&&j<=6){
   mark--;
   random.seek(mark);
   n=random.readByte();
   if(n=='\n'){
    endPosition=random.getFilePointer();
    j++;
   }                                                                                     //去掉临时文件末尾的6个'\n'字符
  }
  random.seek(forthEnPosition);
  long startPosition=random.getFilePointer();
  while(startPosition<endPosition-1){
   n=random.readByte();
   random2.write(n);                                                  //将临时文件去掉头尾后写入到新建的文件中
   startPosition=random.getFilePointer();
  }
  random2.close();
  random.close();
  f1.delete();
%>
<script language="javascript">alert("文件上传成功!");history.back();</script>
<%
 }catch(Exception e)
 {
  e.printStackTrace();
  out.println("上传文件失败!");
 }
%>


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/he_hchx/archive/2007/04/28/1589007.aspx
我主要是不明白客户端是用什么方式或代码,获取到服务器的上传路径的?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘