談一下文件上傳
發(fā)表時(shí)間:2023-08-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在這里看到很多討論文件上傳的文章,覺得各有利敝,有些只限于上傳文件,而不能同時(shí)取得文本字段值,尤其是上傳多個(gè)文件比較少,現(xiàn)本人做這個(gè)上傳文件的類最多可支持上傳255個(gè)文件,同時(shí)可取得文本字段值,請(qǐng)各...
在這里看到很多討論文件上傳的文章,覺得各有利敝,有些只限于上傳文件,而不能同時(shí)取得文本字段值,尤其是上傳多個(gè)文件比較少,現(xiàn)本人做這個(gè)上傳文件的類最多可支持上傳255個(gè)文件,同時(shí)可取得文本字段值,請(qǐng)各位高手指正.
文件上傳類:MoqUploadBean.java
package net.jspcn.tool;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
/**
*
* Title: 文件上傳類
* Description: 既能對(duì)文件進(jìn)行上傳,又能取得輸入框的值,最多可同時(shí)上傳255個(gè)文件
* Copyright: Copyright (c) 2002
* Company: Tekson
* @author 莫瓊
* @version 1.0
*/
public class UploadBean {
private String[] sourceFile = new String[255]; //源文件名
private String[] suffix = new String[255]; //文件后綴名
private String canSuffix = ".gif.jpg.jpeg.png"; //可上傳的文件后綴名
private String objectPath = "c:/"; //目標(biāo)文件目錄
private String[] objectFileName = new String[255]; //目標(biāo)文件名
private ServletInputStream sis = null; //輸入流
private String[] description = new String[255]; //描述狀態(tài)
private long size = 100 * 1024; //限制大小
private int count = 0; //已傳輸文件數(shù)目
private byte[] b = new byte[4096]; //字節(jié)流存放數(shù)組
private boolean successful = true;
private Hashtable fields = new Hashtable();
public UploadBean() {
}
//設(shè)置上傳文件的后綴名
public void setSuffix(String canSuffix) {
this.canSuffix = canSuffix;
}
//設(shè)置文件保存路徑
public void setObjectPath(String objectPath) {
this.objectPath = objectPath;
}
//設(shè)置文件保存路徑
public void setSize(long maxSize) {
this.size = maxSize;
}
//文件上傳處理程序
public void setSourceFile(HttpServletRequest request) throws 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) {
// 取得文件數(shù)據(jù)
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);
if (canTransfer(count)) {
transferFile(count);
}
++count;
} else if ( (k = s.indexOf("name=\"")) != -1) {
// 普通表單輸入元素,獲取輸入元素名字
String fieldName = s.substring(k+6, s.length()-3);
sis.readLine(b, 0, b.length);
StringBuffer fieldValue = new StringBuffer(b.length);
while ( (a = sis.readLine(b, 0, b.length)) != -1) {
s = new String(b, 0, a-2);
if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) {
break;
} else {
fieldValue.append(s);
}
}
fields.put(fieldName, fieldValue.toString());
}
if (!successful)
break;
}
}
//取得表單元素值
public String getFieldValue(String fieldName) {
if (fields == null fieldName == null) {
return null;
}
return (String) fields.get(fieldName);
}
//取得上傳文件數(shù)
public int getCount() {
return count;
}
//取得目標(biāo)路徑
public String getObjectPath() {
return objectPath;
}
//取得源文件名
public String[] getSourceFile() {
return sourceFile;
}
//取得目標(biāo)文件名
public String[] getObjectFileName() {
return objectFileName;
}
//取得上傳狀態(tài)描述
public String[] getDescription() {
return description;
}
//判斷上傳文件的類型
private boolean canTransfer(int i) {
suffix[i] = suffix[i].toLowerCase();
//這個(gè)是用來傳圖片的,各位可以把后綴名改掉或者不要這個(gè)條件
if (sourceFile[i].equals("") (!(canSuffix.indexOf("."+suffix[i])>=0))) {
description[i] = "ERR: File suffix is wrong.";
return false;
}
else {
return true;
}
}
//上傳文件轉(zhuǎn)換
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; //標(biāo)示已經(jīng)傳輸?shù)淖止?jié)數(shù)
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.";
}
out.close();
if (!successful) {
sis.close();
File tmp = new File(objectPath + objectFileName[count]);
tmp.delete();
}
}
catch (IOException ioe) {
description[i] = ioe.toString();
}
}
public static void main(String[] args) {
System.out.println("Test OK");
}
}
文件上傳調(diào)用:MoqUpload.jsp
〈%@ page contentType="text/html; charset=GB2312" %>
〈html>
〈head>
〈title>文件上載〈/title>
〈/head>
〈body>
〈form action="MoqUploadSubmit.jsp" enctype="MULTIPART/FORM-DATA" method="post">
作者姓名:〈input type="text" name="Author" />
〈br />
公司名稱:〈input type="text" name="Company" />
〈br />
文件描述:〈input type="text" name="Comment" />
〈br />
選擇文件1:〈input type="file" name="filename1" />
〈br />
選擇文件2:〈input type="file" name="filename2" />
〈br />
選擇文件3:〈input type="file" name="filename3" />
〈br />
選擇文件4:〈input type="file" name="filename4" />
〈br />
〈input type="submit" value="上載" />
〈/form>
〈/body>
〈/html>
文件上傳提交:MoqUploadSubmit.jsp
〈%@ page contentType="text/html;charset=gb2312"%>
〈jsp:useBean id="fileBean" scope="page" class="net.moq.www.MoqUploadBean" />
〈%
fileBean.setObjectPath("D:\\Temp\\");
fileBean.setSize(10000*1024);
fileBean.setSuffix(".gif.jpg.png.jpge.html.htm");
fileBean.setSourceFile(request);
String [] saSourceFile = fileBean.getSourceFile();
String [] saObjectFile = fileBean.getObjectFileName();
String [] saDescription = fileBean.getDescription();
int iCount = fileBean.getCount();
String sObjectPath = fileBean.getObjectPath();
for(int i=0;i〈iCount;i++) {
out.println("〈br>源始文件:");
out.println(saSourceFile[i]);
out.println("〈br>目標(biāo)文件:");
out.println(sObjectPath+saObjectFile[i]);
out.println("〈br>上傳說明:");
out.println(saDescription[i]);
out.println("〈br>");
}
out.println("〈br>作者:" + fileBean.getFieldValue("Author"));
out.println("〈br>公司:" + fileBean.getFieldValue("Company"));
out.println("〈br>說明:" + fileBean.getFieldValue("Comment"));
%>