File upload by JSP (转)

本文介绍了一种使用JSP进行文件上传的方法,该方法不依赖于SmartUpload等第三方组件,并提供了完整的源代码实现。文章针对原始代码进行了改进,使其能够支持所有文件格式的上传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

File upload by JSP (转)[@more@]

In forum, a lot of people are looking for another way to UPLOAD file by JSP,other than SmartUpload,which is a free bean from jspsmart.com.

Although its functionality is powerful, at least called "enough", the sourcecode is invisible to us,which is a little pity of this bean.

A few days ago,I got an article talking about the upload things on onJava.com.

and the author provided a piece of code to implement upload feature.

Click  http://www.onjava.com/pub/a/onjava/2001/04/05/upload.html to enjoy it!

However, there is also a flaw in his code, that's it only supports text plain file but binary format.In fact, most of files to upload are in binary format,aren't they?

But don't worry, I have made some modification on the original sourcecode to enable it to support all file formats.

Now I paste the whole source code below,

hopefully it can be helpful to those who are interested in this problem.

BTW: My EMail is truelwl@sina.com, welcome to send mail and discuss with me on any Java technical issues.

Code:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletInputStream;
import java.util.Dictionary;
import java.util.Hashtable;
import java.io.PrintWriter;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class FileUploadbean{
  private String savePath, filepath, filename, contentType;
  private Dictionary fields;
  //Begin Rayman's modification
  private static final int BUF_SIZE = 256;
  //End Rayman's modification

  public String getFilename() {
  return filename;
  }

  public String getFilepath() {
  return filepath;
  }

  public void setSavePath(String savePath) {
  this.savePath = savePath;
  }

  public String getContentType() {
  return contentType;
  }

  public String getFieldValue(String fieldName) {
  if (fields == null ¦¦ fieldName == null)
  {
  //System.out.println(fieldName);
  //System.out.println("if loop");
  return null;
  }
  //System.out.println(fieldName);
  //System.out.println(fields.get("company"));
  return (String)fields.get(fieldName);
  }

  private void setFilename(String s) {

  if (s==null)
  return;

  int pos = s.indexOf("filename="");
  if (pos != -1) {
  filepath = s.substring(pos+10, s.length()-1);
  // windows browsers include the full path on the client
  // But Linux/unix and Mac browsers only send the filename
  // test if this is from a Windows browser
  pos = filepath.lastIndexOf("");
  if (pos != -1)
  filename = filepath.substring(pos + 1);
  else
  filename = filepath;
  }
  }

  private void setContentType(String s){
  if (s==null)
  return;

  int pos = s.indexOf(": ");
  if (pos != -1)
  contentType = s.substring(pos+2, s.length());
  }

 

  public void doUpload(HttpServletRequest request) throws IOException{

  ServletInputStream in = request.getInputStream();


  byte[] line = new byte[BUF_SIZE];
  int i = in.readLine(line, 0, 128);
  if (i < 3)
  return;
  int boundaryLength = i - 2;

  String boundary = new String(line, 0, boundaryLength); //-2 discards the newline character
  fields = new Hashtable();

  while (i != -1) {
  String newLine = new String(line, 0, i);
  if (newLine.startsWith("Content-Disposition: form-data; name="")) {
  if (newLine.indexOf("filename="") != -1) {
  setFilename(new String(line, 0, i-2));
  if (filename==null)
  return;
  //this is the file content
  i = in.readLine(line, 0, 128);
  setContentType(new String(line, 0, i-2));
  i = in.readLine(line, 0, 128);
 
  //Begin Rayman's modification
  FileOutputStream pw = new FileOutputStream((savePath==null? "" : savePath) + filename);
  boolean done = false;
  int k = 0;
  byte c1 = 0x0d;
  byte c2 = 0x0a;

  byte [] boundarybytes = boundary.getBytes();
  byte [] magickey = new byte[boundarybytes.length + 2];
  magickey[0] = c1;
  magickey[1] = c2;
  for(int t = 0;t  {
  magickey[2+t] = boundarybytes[t];
  }
 
  byte [] buf = new byte[magickey.length];
  int count = 0;
  byte c = -1;
  boolean pause = false;
  while (true) {
  // the problem is the last line of the file content
  // contains the new line character.
  // So, we need to check if the current line is
  // the last line
  if(!pause)
  {
  byte [] one = new byte[1];
  if(in.read(one)==-1) break;
  c = one[0];
  count ++;
  }
  else
  {
  pause = false;
  }

  if(c==magickey[k])
  {
  System.out.print((int)c + " " + (char)c + " ");
  if(k == magickey.length-1)
  {
  //It's last line.
  System.out.println("Last line!" + " count==" + count);
  break;
  }
  buf[k] = (byte)c;
  k++;
  }
  else
  {
  if(k>0)
  {

  pw.write(buf,0,k);

  }
  if(c==magickey[0])
  {
  pause = true;
  }
  else
  {
  pw.write(c);
  }
  k=0;
  }
  }
  pw.close();
   //End Rayman's modification

  }
  else {
  //this is a field
  // get the field name
  int pos = newLine.indexOf("name="");
  String fieldName = newLine.substring(pos+6, newLine.length()-3);
  //System.out.println("fieldName:" + fieldName);
  // blank line
  i = in.readLine(line, 0, 128);
  i = in.readLine(line, 0, 128);
  newLine = new String(line, 0, i);
  StringBuffer fieldValue = new StringBuffer(128);
  while (i != -1 && !newLine.startsWith(boundary)) {
  // The last line of the field
  // contains the new line character.
  // So, we need to check if the current line is
  // the last line.
  i = in.readLine(line, 0, 128);
  if ((i==boundaryLength+2 ¦¦ i==boundaryLength+4) // + 4 is eof
  && (new String(line, 0, i).startsWith(boundary)))
  fieldValue.append(newLine.substring(0, newLine.length()-2));
  else
  fieldValue.append(newLine);
  newLine = new String(line, 0, i);
  }
  //System.out.println("fieldValue:" + fieldValue.toString());
  fields.put(fieldName, fieldValue.toString());
  }
  }
  i = in.readLine(line, 0, 128);

  } // end while
  }

  public FileUploadBean()
  {
  }
}

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-991215/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-991215/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值