---upload.jsp
成都創(chuàng)新互聯(lián)公司成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站開(kāi)發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計(jì),自適應(yīng)網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì)師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:028-86922220
%@ page language="java" import="java.util.*" pageEncoding="utf-8"%
%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%
%@ page contentType="text/html;charset=gb2312"%
htmltitle%= application.getServerInfo() %/title
body
上傳文件
form action="doUpload.jsp" method="post" enctype="multipart/form-data"
%--?類型enctype用multipart/form-data,
這樣可以把文件中的數(shù)據(jù)作為流式數(shù)據(jù)上傳,不管是什么文件類型,均可上傳。--%
請(qǐng)選擇要上傳的文件
input type="file" name="upfile" size="50"
input type="submit" value="提交"
/form/body
/html
----doUpload.jsp
%@ page language="java" import="java.util.*" pageEncoding="utf-8"%
%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%
%@ page contentType="text/html; charset=GBK"%
%@ page import="java.io.*"%
%@ page import="java.util.*"%
%@ page import="javax.servlet.*"%
%@ page import="javax.servlet.http.*"%
html
head
titleupFile/title
/head
body bgcolor="#ffffff"
%
//定義上載文件的最大字節(jié)
int MAX_SIZE = 102400 * 102400;
//創(chuàng)建根路徑的保存變量
String rootPath;
//聲明文件讀入類
DataInputStream in = null;
FileOutputStream fileOut = null;
//取得客戶端的網(wǎng)絡(luò)地址
String remoteAddr = request.getRemoteAddr();
//獲得服務(wù)器的名字
String serverName = request.getServerName();
//取得互聯(lián)網(wǎng)程序的絕對(duì)地址
String realPath = request.getRealPath(serverName);
realPath = realPath.substring(0, realPath.lastIndexOf("\\"));
//創(chuàng)建文件的保存目錄
rootPath = realPath + "\\upload\\";
//取得客戶端上傳的數(shù)據(jù)類型
String contentType = request.getContentType();
try {
if (contentType.indexOf("multipart/form-data") = 0) {
//讀入上傳的數(shù)據(jù)
in = new DataInputStream(request.getInputStream());
int formDataLength = request.getContentLength();
if (formDataLength MAX_SIZE) {
out.println("P上傳的文件字節(jié)數(shù)不可以超過(guò)" + MAX_SIZE + "/p");
return;
}
//保存上傳文件的數(shù)據(jù)
byte dataBytes[] = new byte[formDataLength];
int byteRead = 0;
int totalBytesRead = 0;
//上傳的數(shù)據(jù)保存在byte數(shù)組
while (totalBytesRead formDataLength) {
byteRead = in.read(dataBytes, totalBytesRead,
formDataLength);
totalBytesRead += byteRead;
}
//根據(jù)byte數(shù)組創(chuàng)建字符串
String file = new String(dataBytes);
//out.println(file);
//取得上傳的數(shù)據(jù)的文件名
String saveFile = file.substring(file
.indexOf("filename=\"") + 10);
saveFile = saveFile.substring(0, saveFile.indexOf("\n"));
saveFile = saveFile.substring(
saveFile.lastIndexOf("\\") + 1, saveFile
.indexOf("\""));
int lastIndex = contentType.lastIndexOf("=");
//取得數(shù)據(jù)的分隔字符串
String boundary = contentType.substring(lastIndex + 1,
contentType.length());
//創(chuàng)建保存路徑的文件名
String fileName = rootPath + saveFile;//out.print(fileName);
int pos;
pos = file.indexOf("filename=\"");
pos = file.indexOf("\n", pos) + 1;
pos = file.indexOf("\n", pos) + 1;
pos = file.indexOf("\n", pos) + 1;
int boundaryLocation = file.indexOf(boundary, pos) - 4;
//out.println(boundaryLocation);
//取得文件數(shù)據(jù)的開(kāi)始的位置
int startPos = ((file.substring(0, pos)).getBytes()).length;
//out.println(startPos);
//取得文件數(shù)據(jù)的結(jié)束的位置
int endPos = ((file.substring(0, boundaryLocation))
.getBytes()).length;
//out.println(endPos);
//檢查上載文件是否存在
File checkFile = new File(fileName);
if (checkFile.exists()) {
out.println("p" + saveFile + "文件已經(jīng)存在./p");
}
//檢查上載文件的目錄是否存在
File fileDir = new File(rootPath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
//創(chuàng)建文件的寫出類
fileOut = new FileOutputStream(fileName);
//保存文件的數(shù)據(jù)
fileOut.write(dataBytes, startPos, (endPos - startPos));
fileOut.close();
out.println(saveFile + "文件成功上載./p");
request.getSession().setAttribute("fileName",saveFile);
} else {
String content = request.getContentType();
out.println("p上傳的數(shù)據(jù)類型不是multipart/form-data/p");
}
} catch (Exception ex) {
throw new ServletException(ex.getMessage());
}
%
/body
/html
JAVA WEB文件上傳步驟如下:
實(shí)現(xiàn) Web 開(kāi)發(fā)中的文件上傳功能,兩個(gè)操作:在 Web 頁(yè)面添加上傳輸入項(xiàng),在 Servlet 中讀取上傳文件的數(shù)據(jù)并保存在本地硬盤中。
1、Web 端上傳文件。在 Web 頁(yè)面中添加上傳輸入項(xiàng):input type="file" 設(shè)置文件上傳輸入項(xiàng)時(shí)應(yīng)注意:(1) 必須設(shè)置 input 輸入項(xiàng)的 name 屬性,否則瀏覽器將不會(huì)發(fā)送上傳文件的數(shù)據(jù)。(2) 必須把 form 的 enctype 屬性設(shè)為 multipart/form-data,設(shè)置該值后,瀏覽器在上傳文件時(shí),將把文件數(shù)據(jù)附帶在 http 請(qǐng)求消息體中,并使用 MIME 協(xié)議對(duì)上傳文件進(jìn)行描述,以方便接收方對(duì)上傳數(shù)據(jù)進(jìn)行解析和處理。(3) 表單提交的方式要是 post
2、服務(wù)器端獲取文件。如果提交表單的類型為 multipart/form-data 時(shí),就不能采用傳統(tǒng)方式獲取數(shù)據(jù)。因?yàn)楫?dāng)表單類型為 multipart/form-data 時(shí),瀏覽器會(huì)將數(shù)據(jù)以 MIME 協(xié)議的形式進(jìn)行描述。如果想在服務(wù)器端獲取數(shù)據(jù),那么我們必須采用獲取請(qǐng)求消息輸入流的方式來(lái)獲取數(shù)據(jù)。
3、Apache-Commons-fileupload。為了方便用戶處理上傳數(shù)據(jù),Apache 提供了一個(gè)用來(lái)處理表單文件上傳的開(kāi)源組建。使用 Commons-fileupload 需要 Commons-io 包的支持。
4、fileuplpad 組建工作流程
(1)客戶端將數(shù)據(jù)封裝在 request 對(duì)象中。
(2)服務(wù)器端獲取到 request 對(duì)象。
(3)創(chuàng)建解析器工廠 DiskFileItemFactory 。
(4)創(chuàng)建解析器,將解析器工廠放入解析器構(gòu)造函數(shù)中。之后解析器會(huì)對(duì) request 進(jìn)行解析。
(5)解析器會(huì)將每個(gè)表單項(xiàng)封裝為各自對(duì)應(yīng)的 FileItem。
(6)判斷代表每個(gè)表單項(xiàng)的 FileItem 是否為普通表單項(xiàng) isFormField,返回 true 為普通表單項(xiàng)。
(7)如果是普通表單項(xiàng),通過(guò) getFieldName 獲取表單項(xiàng)名,getString 獲得表單項(xiàng)值。
(8)如果 isFormField 返回 false 那么是用戶要上傳的數(shù)據(jù),可以通過(guò) getInputStream 獲取上傳文件的數(shù)據(jù)。通過(guò)getName 可以獲取上傳的文件名。
方法/步驟
1
首先這里jsp頁(yè)面的代碼 定義布局文件html的 如圖所示
這是js文件 打開(kāi)一個(gè)新子窗口和向頁(yè)面中加載視頻播放標(biāo)簽
上傳文件java代碼 獲取時(shí)間轉(zhuǎn)換成字符串作為上傳之后的文件名以及設(shè)置保存路徑和傳值到j(luò)sp頁(yè)面
這里copy代碼 將一個(gè)源文件復(fù)制到新的目錄路徑下 如圖所示
這里upload的jsp文件 用來(lái)選擇視頻文件并提交給后臺(tái)
展示舊文件名新文件名和上傳后的文件目錄路徑 并將其傳給父頁(yè)面即index.jsp
upload.jsp文件提交的代碼經(jīng)過(guò)java文件處理后通過(guò)控制轉(zhuǎn)到upload_video.jsp
代碼片段已經(jīng)貼出來(lái)了,接下來(lái)我們開(kāi)始演示界面 打開(kāi)后如圖所示 點(diǎn)擊上傳按鈕
點(diǎn)擊選擇文件 找到要上傳的視頻文件 選中后選擇打開(kāi) 然后點(diǎn)擊確定按鈕
這里就是顯示新舊文件名和文件目錄路徑的界面 點(diǎn)擊確定將文件目錄傳給父文件界面
如圖所示 目錄路徑已經(jīng)出給input中了 點(diǎn)擊播放按鈕 就會(huì)出現(xiàn)播放界面并且自動(dòng)播放了
common-fileupload是jakarta項(xiàng)目組開(kāi)發(fā)的一個(gè)功能很強(qiáng)大的上傳文件組件
下面先介紹上傳文件到服務(wù)器(多文件上傳):
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import org.apache.commons.fileupload.*;
public class upload extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GB2312";
//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out=response.getWriter();
try {
DiskFileUpload fu = new DiskFileUpload();
// 設(shè)置允許用戶上傳文件大小,單位:字節(jié),這里設(shè)為2m
fu.setSizeMax(2*1024*1024);
// 設(shè)置最多只允許在內(nèi)存中存儲(chǔ)的數(shù)據(jù),單位:字節(jié)
fu.setSizeThreshold(4096);
// 設(shè)置一旦文件大小超過(guò)getSizeThreshold()的值時(shí)數(shù)據(jù)存放在硬盤的目錄
fu.setRepositoryPath("c://windows//temp");
//開(kāi)始讀取上傳信息
List fileItems = fu.parseRequest(request);
// 依次處理每個(gè)上傳的文件
Iterator iter = fileItems.iterator();
//正則匹配,過(guò)濾路徑取文件名
String regExp=".+////(.+)$";
//過(guò)濾掉的文件類型
String[] errorType={".exe",".com",".cgi",".asp"};
Pattern p = Pattern.compile(regExp);
while (iter.hasNext()) {
?FileItem item = (FileItem)iter.next();
?//忽略其他不是文件域的所有表單信息
?if (!item.isFormField()) {
? ? ?String name = item.getName();
? ? ?long 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;tempERRORTYPE.LENGTH;TEMP++){
? ? ?if (m.group(1).endsWith(errorType[temp])){
? ? ? ? ? ?throw new IOException(name+": wrong type");
? ? ?}
? ? ?}
? ? ?try{
//保存上傳的文件到指定的目錄
//在下文中上傳文件至數(shù)據(jù)庫(kù)時(shí),將對(duì)這里改寫
? ? ?item.write(new File("d://" + m.group(1)));
out.print(name+" ?"+size+"");
? ? ?}
? ? ?catch(Exception e){
? ? ? ?out.println(e);
? ? ?}
}
?else
?{
? ?throw new IOException("fail to upload");
?}
?}
}
}
catch (IOException e){
out.println(e);
}
catch (FileUploadException e){
out.println(e);
}
}
}
現(xiàn)在介紹上傳文件到服務(wù)器,下面只寫出相關(guān)代碼:
以sql2000為例,表結(jié)構(gòu)如下:
字段名:name ? ?filecode
類型: varchar ? ? image
數(shù)據(jù)庫(kù)插入代碼為:PreparedStatement pstmt=conn.prepareStatement("insert into test values(?,?)");
代碼如下:
。。。。。。
try{
? 這段代碼如果不去掉,將一同寫入到服務(wù)器中
? //item.write(new File("d://" + m.group(1)));
? ? ?
? int byteread=0;
? //讀取輸入流,也就是上傳的文件內(nèi)容
? InputStream inStream=item.getInputStream(); ? ? ? ? ? ?
pstmt.setString(1,m.group(1));
? pstmt.setBinaryStream(2,inStream,(int)size);
? pstmt.executeUpdate();
? inStream.close();
out.println(name+" ?"+size+" ");
? }
。。。。。。
這樣就實(shí)現(xiàn)了上傳文件至數(shù)據(jù)庫(kù)
參考代碼如下:
import java.io.*;
/**
* 復(fù)制文件夾或文件夾
*/
public class CopyDirectory {
// 源文件夾
static String url1 = "f:/photos";
// 目標(biāo)文件夾
static String url2 = "d:/tempPhotos";
public static void main(String args[]) throws IOException {
// 創(chuàng)建目標(biāo)文件夾
(new File(url2)).mkdirs();
// 獲取源文件夾當(dāng)前下的文件或目錄
File[] file = (new File(url1)).listFiles();
for (int i = 0; i file.length; i++) {
if (file[i].isFile()) {
// 復(fù)制文件
copyFile(file[i],new File(url2+file[i].getName()));
}
if (file[i].isDirectory()) {
// 復(fù)制目錄
String sourceDir=url1+File.separator+file[i].getName();
String targetDir=url2+File.separator+file[i].getName();
copyDirectiory(sourceDir, targetDir);
}
}
}
// 復(fù)制文件
public static void copyFile(File sourceFile,File targetFile)
throws IOException{
// 新建文件輸入流并對(duì)它進(jìn)行緩沖
FileInputStream input = new FileInputStream(sourceFile);
BufferedInputStream inBuff=new BufferedInputStream(input);
// 新建文件輸出流并對(duì)它進(jìn)行緩沖
FileOutputStream output = new FileOutputStream(targetFile);
BufferedOutputStream outBuff=new BufferedOutputStream(output);
// 緩沖數(shù)組
byte[] b = new byte[1024 * 5];
int len;
while ((len =inBuff.read(b)) != -1) {
outBuff.write(b, 0, len);
}
// 刷新此緩沖的輸出流
outBuff.flush();
//關(guān)閉流
inBuff.close();
outBuff.close();
output.close();
input.close();
}
// 復(fù)制文件夾
public static void copyDirectiory(String sourceDir, String targetDir)
throws IOException {
// 新建目標(biāo)目錄
(new File(targetDir)).mkdirs();
// 獲取源文件夾當(dāng)前下的文件或目錄
File[] file = (new File(sourceDir)).listFiles();
for (int i = 0; i file.length; i++) {
if (file[i].isFile()) {
// 源文件
File sourceFile=file[i];
// 目標(biāo)文件
File targetFile=new
File(new File(targetDir).getAbsolutePath()
+File.separator+file[i].getName());
copyFile(sourceFile,targetFile);
}
if (file[i].isDirectory()) {
// 準(zhǔn)備復(fù)制的源文件夾
String dir1=sourceDir + "/" + file[i].getName();
// 準(zhǔn)備復(fù)制的目標(biāo)文件夾
String dir2=targetDir + "/"+ file[i].getName();
copyDirectiory(dir1, dir2);
}
}
}
}
// 這是我寫的一個(gè)方法,里面只需要傳兩個(gè)參數(shù)就OK了,在任何地方調(diào)用此方法都可以文件上傳
/**
* 上傳文件
* @param file待上傳的文件
* @param storePath待存儲(chǔ)的路徑(該路徑還包括文件名)
*/
public void uploadFormFile(FormFile file,String storePath)throws Exception{
// 開(kāi)始上傳
InputStream is =null;
OutputStream os =null;
try {
is = file.getInputStream();
os = new FileOutputStream(storePath);
int bytes = 0;
byte[] buffer = new byte[8192];
while ((bytes = is.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytes);
}
os.close();
is.close();
} catch (Exception e) {
throw e;
}
finally{
if(os!=null){
try{
os.close();
os=null;
}catch(Exception e1){
;
}
}
if(is!=null){
try{
is.close();
is=null;
}catch(Exception e1){
;
}
}
}
}