javafile上傳文件
Java入門:理解並實現fileUpload文件上傳功能
fileUpload是Apache Commons組件中的一個強大工具,用於解析HTTP請求中的文件上傳部分。它的主要作用是處理請求的InputStream,簡化上傳過程。查閱詳細文檔可參考:在線API文檔
fileupload組件工作原理是通過構造DiskFileItemFactory和ServletFileUpload對象,前者用於創建臨時文件存儲和內存管理,後者則負責解析請求並進行文件上傳的判斷和處理。核心API包括DiskFileItemFactory的構造方法,ServletFileUpload的isMutipartContent、parseRequest、isFormField等方法,以及用於設置文件大小限制和編碼的設置方法。
實現文件上傳的步驟如下:
- 首先,需要在項目中引入fileupload相關的jar包
- 在JSP頁面上構建上傳表單
- 在Servlet中,創建NewsService對象處理業務邏輯。例如:
NewsService newsService = new NewsService();
InputStream in = null;
OutputStream out = null;
int id = 0;
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
if (!upload.isMultipartContent(request)) return;
List parseRequest = upload.parseRequest(request);
for (FileItem f : parseRequest) {
if (f.isFormField()) {
// 處理普通欄位
id = Integer.parseInt(f.getFieldName());
String value = f.getString();
// ...後續處理
} else {
// 處理上傳文件
String name = f.getName();
String savePath = "D:\workspacedt91\FileUpLoadTestDemo\WebContent\images\" + name;
File path = new File(savePath);
if (!path.exists()) path.getParentFile().mkdir();
in = f.getInputStream();
out = new FileOutputStream(path);
// ...讀取和保存文件到資料庫
}
}
// ...處理可能的FileUploadException
finally {
if (in != null) in.close();
if (out != null) out.close();
}
2. 一文教你實現java中的文件上傳下載
在Java編程中,文件上傳下載功能是一項實用且常見的需求。本文將為你揭示如何實現這一功能,無論是為了工作中的項目需求,還是為了提高個人技能,這都是值得一學的技術點。
實現Java文件上傳下載的步驟
1. 理解需求:工作中的重復代碼問題促使作者記錄下文件上傳下載的解決方案,方便日後快速使用。
2. 技術概述:開始前,熟悉文件上傳下載的技術流程圖,有助於後續操作的順利進行。
3. 前端實現:
- 前端HTML提供File組件,如拖拽或點擊選擇文件上傳。
- 使用JavaScript的drop事件處理文件拖拽。
- AJAX通過FormData上傳文件,如`formData.append('file', file);`
4. 後端介面:在Spring Boot中,通過`@RequestParam`接收上傳的文件,如`MultipartFile file`。
5. 持久化與審計:上傳的文件數據需要存儲在資料庫,並記錄審計日誌。
6. 工具類技巧:分享一些關於IO流文件上傳的實用工具類。
7. 結束語:作者雖然忙碌,但承諾會分享更多有價值的內容,如面試寶典,以回饋讀者的支持。
8. 個人聲明:LRyab博客專注於積累經驗和技能分享,你的點贊是作者寫作的動力。
3. java上傳文件後用戶是如何訪問的(java實現文件上傳的三種方式)
JAVA把文件傳到伺服器.......文件上傳到A以後放到伺服器上面然後他就有一個絕對的訪問路徑也就是對應一個絕對的url這樣就好辦了
Java提供了對URL訪問和大量的流操作的的API,可以很容易的完成對網路上資源的存取,下面的代碼段就完成了對一個網站的資源進行訪問:
......
destUrl="";
//假設你把文件放到webroot底下的java文件裡面
url=newURL(destUrl);
httpUrl=(HttpURLConnection)url.openConnection();
//連接指定的網路資源
httpUrl.connect();
//獲取網路輸入流
bis=newBufferedInputStream(httpUrl.getInputStream());
......
得到流後下面你自己想怎麼操作就怎麼操作了
對於怎麼得到資源的連接地址這個方法很多你可以專門提供一個Servlet獲取到輸出的流後Response.write轉門提供伺服器已上傳的文件文件名可以一天位單位返回
客戶端用與上面同樣的方法得到文件名後拆分然後再繼續循環調用上面的方法下載文件就ok了
呵呵希望可以幫助到你
如何通過Java客戶端程序通過rest介面訪問並上傳文件(文檔)到web伺服器?圖片目錄不在項目路徑下,直接通過HTTP訪問不到,如果你硬是要這么訪問,你可以自己寫一個Servlet,通過流的方式輸出,注意要吧Content-Type設置正確
java上傳成功後怎麼觸發其他操作javaget方式非同步上傳_簡述Java非同步上傳文件的三種方式原創
2021-02-1316:31:03
yibbbian
碼齡4年
關注
本文為大家分享了三種Java非同步上傳文件方式,供大家參考,具體內容如下
用第三方控制項,如Flash,ActiveX等瀏覽器插件上傳。
使用隱藏的iframe模擬非同步上傳。
使用XMLHttpRequest2來實現非同步上傳。
第一種使用瀏覽器插件上傳,需要一定的底層編碼功底,在這里我就不講了,以免誤人子弟,提出這點大家可以自行網路。
第二種使用隱藏的iframe模擬非同步上傳。為什麼在這里說的是模擬呢?因為我們其實是將返回結果放在了一個隱藏的iframe中,所以才沒有使當前頁面跳轉,感覺就像是非同步操作一樣。
隱藏的iframe上傳文件
附件:
正在上傳...
//上傳完成後的回調
functionuploadFinished(fileName){
addToFlist(fileName);
loading(false);
}
functionaddToFlist(fname){
vartemp=["
",
fname,
"刪除",
"
"
];
$("#flist").append(temp.join(""));
}
functionloading(showloading){
if(showloading){
$("#uptxt").show();
}else{
$("#uptxt").hide;
}
}
這種技術有兩個關鍵的地方:
1.form會指定target,提交的結果定向返回到隱藏的ifram中。(即form的target與iframe的name屬性一致)。
2.提交完成後,iframe中頁面與主頁面通信,通知上傳結果及服務端文件信息
如何與主頁面通信呢?
我們用nodejs在接收完了文件後返回了一個window.parent.主頁面定義的方法,執行後可以得知文件上傳完成。代碼很簡單:
router.post('/upload2',multipartMiddleware,function(req,res){
varfpath=req.files.myfile.path;
varfname=fpath.substr(fpath.lastIndexOf('\')+1);
setTimeout(function{
varret=["
"window.parent.uploadFinished('"+fname+"');",
""];
res.send(ret.join(""));
},3000);
});
執行後可以打開開發人員選項,你會發現隱藏iframe中返回了伺服器的一些數據。
第三種使用XMLHttpRequest2來進行真正的非同步上傳。
還是先貼出代碼:
執行後可以打開開發人員選項,你會發現隱藏iframe中返回了伺服器的一些數據。第三種使用XMLHttpRequest2來進行真正的非同步上傳。還是先貼出代碼:
xhrlevel2非同步上傳
附件:
正在上傳...
停止上傳
functionupload{
//1.准備FormData
varfd=newFormData;
fd.append("myfile",$("#myfile")[0].files[0]);
//創建xhr對象
varxhr=newXMLHttpRequest;
//監聽狀態,實時響應
//xhr和xhr.upload都有progress事件,xhr.progress是下載進度,xhr.upload.progress是上傳進度
xhr.upload.onprogress=function(event){
if(event.lengthComputable){
varpercent=Math.round(event.loaded*100/event.total);
console.log('%d%',percent);
$("#upprog").text(percent);
}
};
//傳輸開始事件
xhr.onloadstart=function(event){
console.log('loadstart');
$("#upprog").text('開始上傳');
$("#stopbtn").one('click',function{xhr.abort;$(this).hide();});
loading(true);
};
//ajax過程成功完成事件
xhr.onload=function(event){
console.log('loadsuccess');
$("#upprog").text('上傳成功');
console.log(xhr.responseText);
varret=JSON.parse(xhr.responseText);
addToFlist(ret.fname);
};
//ajax過程發生錯誤事件
xhr.onerror=function(event){
console.log('error');
$("#upprog").text('發生錯誤');
};
//ajax被取消
xhr.onabort=function(event){
console.log('abort');
$("#upprog").text('操作被取消');
};
//loadend傳輸結束,不管成功失敗都會被觸發
xhr.onloadend=function(event){
console.log('loadend');
loading(false);
};
//發起ajax請求傳送數據
xhr.open('POST','/upload3',true);
xhr.send(fd);
}
functionaddToFlist(fname){
vartemp=["
",
fname,
"刪除",
"
"
];
$("#flist").append(temp.join(""));
}
functiondelFile(fname){
console.log('todeletefile:'+fname);
//TODO:請實現
}
functionloading(showloading){
if(showloading){
$("#uptxt").show();
$("#stopbtn").show();
}else{
$("#uptxt").hide();
$("#stopbtn").hide();
}
}
代碼有點多,但是通俗易懂。使用過AJAX的人都知道,XHR對象提供了一個onreadystatechange的回調方法來監聽整個請求/響應過程。在XMLHttpRequest2級規范中又多了幾個進度事件。有以下6個事件:
1.loadstart:在接收到響應數據的第一個位元組時觸發。
2.progress:在接收響應期間持續不斷地觸發。
3.error:在請求發生錯誤時觸發。
4.abort:在因為調用abort方法而終止連接時觸發。
5.load:在接收到完整的響應數據時觸發。
6.loadend:在通信完成或者觸發error,abort,load事件後觸發。
這次我們可以解讀代碼:當傳輸事件開始後,我們便在停止傳送按鈕上添加點擊事件,內置了abort方法可以停止傳送。若不點則會正常上傳直到傳送完畢為止。其後台代碼類似第二種方法。
三種方法各有優劣,做個簡單的小結吧。
第三方控制項交互性和可控性好,因為接近底層,其性能也是很優秀的。但是由於編寫難度大通常需要自己安裝插件,有時可能需要自己進行編寫。
隱藏的iframe方法我個人覺得是非常有思想的一個方法,iframe可以幫我們做很多事。這種方式具有廣泛的瀏覽器兼容性而且不需要安裝插件。但是它交互性差,上傳過程不可控,而且性能也是很一般的。
XHR2級的純ajax上傳,它必須要版本比較高一點的瀏覽器(ie9+)。但是它交互性特別好,可以看到上傳進度並且是可控的。
java如何訪問區域網共享文件?
java訪問共享文件夾,讀取區域網中一台機器的共享目錄中的文件,需要jcifs-1.1.11.jar的支持,使用SMB協議,以下是實現了遠程讀取文件的功能代碼:
package?junit;
import?jcifs.smb.SmbFile;
/**???
?*?java訪問區域網共享目錄
?*
?*?@author?administrator
?*?@version?1.0?2015-7-6?
?*/
public?class?SmbTest?{
????public?static?void?main(String[]?args)?throws?Exception?{
????????//smb://xxx:[email protected]/testIndex/??
????????//xxx:xxx是共享機器的用戶名密碼
????????String?url="smb://192.168.2.188/testIndex/";
????????SmbFile?file?=?new?SmbFile(url);
????????if(file.exists()){
????????????SmbFile[]?files?=?file.listFiles();
????????????for(SmbFile?f?:?files){
????????????????System.out.println(f.getName());
????????????}
????????}
????}
}
java文件上傳後,一般怎麼和用戶掛鉤呢?第一個問題,如果有單獨的文件伺服器,上傳的每一個文件有一個唯一的id,{id,filePath},id與用戶關聯即可.
第二個問題,可以一組文件分配一個id,表示這些文件是一個組的,id與用戶關聯.
4. java如何實現文件上傳
public static int transFile(InputStream in, OutputStream out, int fileSize) {
int receiveLen = 0;
final int bufSize = 1000;
try {
byte[] buf = new byte[bufSize];
int len = 0;
while(fileSize - receiveLen > bufSize)
{
len = in.read(buf);
out.write(buf, 0, len);
out.flush();
receiveLen += len;
System.out.println(len);
}
while(receiveLen < fileSize)
{
len = in.read(buf, 0, fileSize - receiveLen);
System.out.println(len);
out.write(buf, 0, len);
receiveLen += len;
out.flush();
}
} catch (IOException e) {
// TODO 自動生成 catch 塊
e.printStackTrace();
}
return receiveLen;
}
這個方法從InputStream中讀取內容,寫到OutputStream中。
那麼發送文件方,InputStream就是FileInputStream,OutputStream就是Socket.getOutputStream.
接受文件方,InputStream就是Socket.getInputStream,OutputStream就是FileOutputStream。
就OK了。 至於存到資料庫里嘛,Oracle里用Blob。搜索一下,也是一樣的。從Blob能獲取一個輸出流。
5. java怎麼用commons-fileupload實現上傳文件
文件上傳步驟:
1.導入jar包
common-fileupload.jar
common-io.jar
2.上傳jsp頁面編輯
<body>
<formaction="${pageContext.request.contextPath}/servlet/UploadHandleServlet"enctype="multipart/form-data"method="post">
上傳用戶:<inputtype="text"name="username"><br/>
上傳文件1:<inputtype="file"name="file1"><br/>
上傳文件2:<inputtype="file"name="file2"><br/>
<inputtype="submit"value="提交">
</form>
</body>
3.消息提示頁面(成功or失敗)
<body>
${message}
</body>
4.處理文件上傳的servlet編寫
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.List;
importjava.util.UUID;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.commons.fileupload.FileItem;
importorg.apache.commons.fileupload.FileUploadBase;
importorg.apache.commons.fileupload.ProgressListener;
importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
importorg.apache.commons.fileupload.servlet.ServletFileUpload;
{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//得到上傳文件的保存目錄,將上傳的文件存放於WEB-INF目錄下,不允許外界直接訪問,保證上傳文件的安全
StringsavePath=this.getServletContext().getRealPath("/WEB-INF/upload");
//上傳時生成的臨時文件保存目錄
StringtempPath=this.getServletContext().getRealPath("/WEB-INF/temp");
FiletmpFile=newFile(tempPath);
if(!tmpFile.exists()){
//創建臨時目錄
tmpFile.mkdir();
}
//消息提示
Stringmessage="";
try{
//使用Apache文件上傳組件處理文件上傳步驟:
//1、創建一個DiskFileItemFactory工廠
DiskFileItemFactoryfactory=newDiskFileItemFactory();
//設置工廠的緩沖區的大小,當上傳的文件大小超過緩沖區的大小時,就會生成一個臨時文件存放到指定的臨時目錄當中。
factory.setSizeThreshold(1024*100);//設置緩沖區的大小為100KB,如果不指定,那麼緩沖區的大小默認是10KB
//設置上傳時生成的臨時文件的保存目錄
factory.setRepository(tmpFile);
//2、創建一個文件上傳解析器
ServletFileUploapload=newServletFileUpload(factory);
//監聽文件上傳進度
upload.setProgressListener(newProgressListener(){
publicvoipdate(longpBytesRead,longpContentLength,intarg2){
System.out.println("文件大小為:"+pContentLength+",當前已處理:"+pBytesRead);
/**
*文件大小為:14608,當前已處理:4096
文件大小為:14608,當前已處理:7367
文件大小為:14608,當前已處理:11419
文件大小為:14608,當前已處理:14608
*/
}
});
//解決上傳文件名的中文亂碼
upload.setHeaderEncoding("UTF-8");
//3、判斷提交上來的數據是否是上傳表單的數據
if(!ServletFileUpload.isMultipartContent(request)){
//按照傳統方式獲取數據
return;
}
//設置上傳單個文件的大小的最大值,目前是設置為1024*1024位元組,也就是1MB
upload.setFileSizeMax(1024*1024);
//設置上傳文件總量的最大值,最大值=同時上傳的多個文件的大小的最大值的和,目前設置為10MB
upload.setSizeMax(1024*1024*10);
//4、使用ServletFileUpload解析器解析上傳數據,解析結果返回的是一個List<FileItem>集合,每一個FileItem對應一個Form表單的輸入項
List<FileItem>list=upload.parseRequest(request);
for(FileItemitem:list){
//如果fileitem中封裝的是普通輸入項的數據
if(item.isFormField()){
Stringname=item.getFieldName();
//解決普通輸入項的數據的中文亂碼問題
Stringvalue=item.getString("UTF-8");
//value=newString(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name+"="+value);
}else{//如果fileitem中封裝的是上傳文件
//得到上傳的文件名稱,
Stringfilename=item.getName();
System.out.println(filename);
if(filename==null||filename.trim().equals("")){
continue;
}
//注意:不同的瀏覽器提交的文件名是不一樣的,有些瀏覽器提交上來的文件名是帶有路徑的,如:c:a1.txt,而有些只是單純的文件名,如:1.txt
//處理獲取到的上傳文件的文件名的路徑部分,只保留文件名部分
filename=filename.substring(filename.lastIndexOf("\")+1);
//得到上傳文件的擴展名
StringfileExtName=filename.substring(filename.lastIndexOf(".")+1);
//如果需要限制上傳的文件類型,那麼可以通過文件的擴展名來判斷上傳的文件類型是否合法
System.out.println("上傳的文件的擴展名是:"+fileExtName);
//獲取item中的上傳文件的輸入流
InputStreamin=item.getInputStream();
//得到文件保存的名稱
StringsaveFilename=makeFileName(filename);
//得到文件的保存目錄
StringrealSavePath=makePath(saveFilename,savePath);
//創建一個文件輸出流
FileOutputStreamout=newFileOutputStream(realSavePath+"\"+saveFilename);
//創建一個緩沖區
bytebuffer[]=newbyte[1024];
//判斷輸入流中的數據是否已經讀完的標識intlen=0;
//循環將輸入流讀入到緩沖區當中,(len=in.read(buffer))>0就表示in裡面還有數據
while((len=in.read(buffer))>0){
//使用FileOutputStream輸出流將緩沖區的數據寫入到指定的目錄(savePath+"\"+filename)當中
out.write(buffer,0,len);
}
//關閉輸入流
in.close();
//關閉輸出流
out.close();//刪除處理文件上傳時生成的臨時文件//item.delete();message="文件上傳成功!";
}
}
}catch(FileUploadBase.){
e.printStackTrace();
request.setAttribute("message","單個文件超出最大值!!!");
request.getRequestDispatcher("/message.jsp").forward(request,response);
return;
}catch(FileUploadBase.SizeLimitExceededExceptione){
e.printStackTrace();
request.setAttribute("message","上傳文件的總的大小超出限制的最大值!!!");
request.getRequestDispatcher("/message.jsp").forward(request,response);
return;
}catch(Exceptione){
message="文件上傳失敗!";
e.printStackTrace();
}
request.setAttribute("message",message);
request.getRequestDispatcher("/message.jsp").forward(request,response);
}
privateStringmakeFileName(Stringfilename){//2.jpg
//為防止文件覆蓋的現象發生,要為上傳文件產生一個唯一的文件名
returnUUID.randomUUID().toString()+"_"+filename;
}
privateStringmakePath(Stringfilename,StringsavePath){
//得到文件名的hashCode的值,得到的就是filename這個字元串對象在內存中的地址
inthashcode=filename.hashCode();
intdir1=hashcode&0xf;//0--15
intdir2=(hashcode&0xf0)>>4;//0-15
//構造新的保存目錄
Stringdir=savePath+"\"+dir1+"\"+dir2;//upload23upload35
if(!file.exists()){
file.mkdirs();
}
returndir;
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
5.編寫web.xml文件(servlet的映射配置)
<servlet>
<servlet-name>UploadHandleServlet</servlet-name>
<servlet-class>me.gacl.web.controller.UploadHandleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadHandleServlet</servlet-name>
<url-pattern>/servlet/UploadHandleServlet</url-pattern>
</servlet-mapping>
註:網上看到的,出處找不到了,望見諒!!
6. java 上傳文件 問題
不用 下載相應jar包 引入就可以了 import 你懂得