java文件上傳struts
1. struts2.0怎麼實現上傳文件
一、創建jsp頁面:
注意!要上傳文件,表單必須添加 enctype 屬性,如下: enctype="multipart/form-data"
index.jsp 代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 注意!表單必須添加 enctype 屬性,值為"multipart/form-data" -->
<form action="upload.action" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="上傳"/>
</form>
</body>
</html>
二、創建Action類:
1. 添加三個私有欄位,並添加相應的get,set方法。
private File file; ——上傳的文件,變數名對應頁面上"file"input的name屬性值。類型為java.io.File
private String fileContentType;——上傳文件的格式類型名,變數名格式為:頁面上"file"input的name屬性值+ContentType
private String fileFileName——上傳的文件名,變數名格式為:頁面上"file"input的name屬性值+fileFileName。
2. 使用struts2提供的FileUtils類拷貝進行文件的拷貝。FileUtils類位於org.apache.commons.io包下。
3. 在項目目錄下的WebContent目錄下添加 upload 文件夾,用於存放客戶端上傳過來的文件,對應第15行代碼。
Upload.java代碼如下:
1 import java.io.File;
2 import java.io.IOException;
3 import org.apache.commons.io.FileUtils;
4 import org.apache.struts2.ServletActionContext;
5 import com.opensymphony.xwork2.ActionSupport;
6
7 public class Upload extends ActionSupport{
8 private File file;
9 private String fileContentType;
10 private String fileFileName;
11
12 @Override
13 public String execute() throws Exception {
14 //得到上傳文件在伺服器的路徑加文件名
15 String target=ServletActionContext.getServletContext().getRealPath("/upload/"+fileFileName);
16 //獲得上傳的文件
17 File targetFile=new File(target);
18 //通過struts2提供的FileUtils類拷貝
19 try {
20 FileUtils.File(file, targetFile);
21 } catch (IOException e) {
22 e.printStackTrace();
23 }
24 return SUCCESS;
25 }
26
27 //省略get,set方法...........
28
29 }
三、在struts.xml中添加相應的配置代碼。
struts.xml代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="upload" class="Upload">
<result>index.jsp</result>
</action>
</package>
</struts>
四、測試。
啟動伺服器,進入index頁面。
選擇一改圖片,點擊上傳提交表單。
打開upload文件夾(注意,這里指的是web伺服器下的目錄,如我用的web伺服器是tomcat安裝在電腦D盤,項目名稱為「Struts2Upload」那麼其路徑為:D:\apache-tomcat-7.0.40\webapps\Struts2Upload\upload)可以看到剛才選中的圖片已經上傳到該目錄下了。
上傳多個文件
一、修改頁面文件
增加繼續添加按鈕和 addfile() 方法,讓頁面可以通過javascript增加 input 標簽。
修改後的 index.jsp代碼如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <html>
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7 <script type="text/javascript">
8 //添加javascript方法 addfile() 在頁面中境加input標簽、
9 function addfile(){
10 var file = document.createElement("input");
11 file.type="file";
12 file.name="file";
13 document.getElementById("fileList").appendChild(file);
14 document.getElementById("fileList").appendChild(document.createElement("br"));
15 }
16 </script>
17 <title>Insert title here</title>
18 </head>
19 <body>
20 <!-- 注意!表單必須添加 enctype 屬性,值為"multipart/form-data" -->
21 <form action="upload.action" method="post" enctype="multipart/form-data">
22 <div id="fileList">
23 <input type="file" name="file" /><br/>
24 </div>
25 <!-- 添加繼續添加按鈕,點擊按鈕調用addfile() -->
26 <input type="button" value="繼續添加" onclick="addfile()" />
27 <input type="submit" value="上傳"/>
28 </form>
29 </body>
30 </html>
二、修改Action類
1. 把三個私有欄位(file,fileContentType,fileFileName)的類型更改為數組或集合類型。並添加相應的get,set方法。
2. 通過循環來上傳多個文件。
修改後的Upload.java代碼如下:
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Upload extends ActionSupport{
//把這三個欄位類型更改為數組或集合
private File[] file;
private String[] fileContentType;
private String[] fileFileName;
@Override
public String execute() throws Exception {
//通過循環來上傳多個文件
for(int i=0;i<file.length;i++){
//得到上傳文件在伺服器的路徑加文件名
String target=ServletActionContext.getServletContext().getRealPath("/upload/"+fileFileName[i]);
//獲得上傳的文件
File targetFile=new File(target);
//通過struts2提供的FileUtils類拷貝
try {
FileUtils.File(file[i], targetFile);
} catch (IOException e) {
e.printStackTrace();
}
}
return SUCCESS;
}
//省略set,get方法...................
}
三、測試
1. 啟動伺服器,打開index.jsp頁面。點擊繼續添加,添加兩個input。同時上傳三張圖片。
2. 點擊上傳提交表單。打開upload文件夾,可以看到剛才選中的三張圖片已經上傳到該目錄下了。
參考資料http://www.cnblogs.com/likailan/p/3330465.html
2. struts關於文件上傳
new File()只是根據路徑建立一個新的File實例,至於該路徑是文件夾還是文件名,還是不存在都有可能。如培頌果新建的文件 目錄不存 往往先構建父目錄 這也是編程的習慣歲爛,僅僅如此
System.out.println(realPath);
File saveDir=new File(realPath);//按照realPath構建一個File實例
if(!saveDir.exists()) saveDir.mkdirs();//判斷File實例對應的文件是否存在,如果不存在,則按照路徑構建一個文件夾。
if(image!=null)
{
File saveFile=new File(saveDir, imageFileName);//按照父目錄saveDir路徑和文件名構建一個File實配雀鄭例
FileUtils.File(image, saveFile);//根據saveFile所包含路徑信息,把image寫入文件系統(硬碟)
}
return SUCCESS;
}
3. 用Java的三大框架實現文件的上傳下載,求代碼啊,最好是分為action,service,serv
package cn.itcast.struts2.demo1;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 完成文件上傳 (不是解析上傳內容,因為上傳內容 由fileUpload攔截器負責解析)
*
* @author seawind
*
*/
public class UploadAction extends ActionSupport {
// 接收上傳內容
// <input type="file" name="upload" />
private File upload; // 這里變數名 和 頁面表單元素 name 屬性一致
private String uploadContentType;
private String uploadFileName;
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
@Override
public String execute() throws Exception {
if (upload == null) { // 通過xml配置 required校驗器 完成校驗
// 沒有上傳文件
return NONE;
}
// 將上傳文件 保存到伺服器端
// 源文件 upload
// 目標文件
File destFile = new File(ServletActionContext.getServletContext()
.getRealPath("/upload") + "/" + uploadFileName);
// 文件復制 使用commons-io包 提供 工具類
FileUtils.File(upload, destFile);
return NONE;
}
}
多文件上傳
package cn.itcast.struts2.demo1;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 支持多文件上傳
*
* @author seawind
*
*/
public class MultiUploadAction extends ActionSupport {
// 接收多文件上傳參數,提供數組接收就可以了
private File[] upload;
private String[] uploadContentType;
private String[] uploadFileName;
public void setUpload(File[] upload) {
this.upload = upload;
}
public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
}
@Override
public String execute() throws Exception {
for (int i = 0; i < upload.length; i++) {
// 循環完成上傳
File srcFile = upload[i];
String filename = uploadFileName[i];
// 定義目標文件
File destFile = new File(ServletActionContext.getServletContext()
.getRealPath("/upload" + "/" + filename));
FileUtils.File(srcFile, destFile);
}
return NONE;
}
}
4. Java struts2上傳文件空指針問題。。。。 java.lang.NullPointerException java.io.File.<init>
要看是代碼那一行報這個錯,然後進行調試找出為空的對象是哪一個,查出原因!
5. strut上傳文件報錯java.lang.OutOfMemoryError: Java heap space
超出虛擬機內存了吧,改下jvm內存,網上有很多設置的帖子的
6. 怎樣將struts2上傳文件保存到資料庫中
1在你的struts-config中首先不能使用form,使用的話會報錯
2在你jsp的form中增加屬性enctype="multipart/form-data"
這樣你的文件內容會被都城二進制數據傳到後台,在後台獲取值保存及可以了
7. struts 文件上傳錯誤
Struts2本身提供了一個文件上傳的攔截器,通過配置該攔截器可以更輕松地實現文件過濾。我們只需要在Action中配置該攔截器就可以了。當文件過濾失敗後,會自動轉向input邏輯視圖,因此必須為該Action配置名為input的邏輯視圖,除此之外還必須為配置defaultStack的攔截器的引用。配置文件如下:
<action name="upload" class="com.annlee.upload.UploadAction" >
<!-- 配置fileUpload的攔截器 -->
<interceptor-ref name="fileUpload">
<!-- 配置允許上傳的文件類型 -->
<param name="allowedTypes">image/bmp,image/gif,image/jpg</param>
<!-- 配置允許上傳的文件大小 -->
<param name="maximumSize">2000000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<param name="savePath">/</param>
<result>/common/succ.jsp</result>
<result name="input">/cos_fileupload/fileupload.jsp</result>
</action>
如果上傳失敗系統會返回到原來的頁面,要在原來的頁面上加上以下錯誤提示代碼:
<s:fielderror />這樣系統就會返回提示給用戶,但是這時的提示是Struts2自帶的提示,非常不友好,我們可以國際化資源里配置以下兩項,我們的提示就會自動替換Struts2的提示,提示的關鍵字如下
struts.messages.error.file.too.large
struts.messages.error.content.type.not.allowed
此外,如果用戶上傳失敗的原因不是因為以上兩種還有另外的一個信息提示用戶,它的關健字是:struts.messages.error.uploading,我們也應該替換這個提示信息。
其它說明:如果沒有指定臨時的保存文件夾,系統就會使用javax.servlet.context.tempdir路徑,這個路徑是Tomcat的work\Catalina\localhost\,我們應該設置自己的路徑,這個配置的屬性為struts.multipart.saveDir可以在struts.properties中配置,還有一個文件上傳的屬性:struts.multipart.maxSize設置整個表單請求內容的最大位元組數。
8. Struts2中怎麼上傳以*.jar格式結尾的文件看了好都是圖片格式,XML、txt格式等,就是沒有jar格式滴。
下面是我的一個示例
Struts2-文件上傳示例
1.在Struts2項目(Struts2)下導入上傳文件必要的jar包
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
2. 文件上傳頁面(fileUpload.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>文件上傳頁面</title></head>
<body>
<form action="fileupload.action" method="post" enctype="multipart/form-data"><!-- 對於文件上傳,form應滿足的配置 -->
username:<input type="text" name="username"><br/>
file:<input type="file" name="file"><br/>
<input type="submit" value="submit">
</form>
</body>
</html>
3.定義上傳文件的Action( UploadAction.java)
package com.zlc.struts2;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
private String username;
private File file;//要上傳的具體文件
private String fileFileName;//表示文件名字(固定寫法)
private String fileContentType;//文件類型(必須滿足約束的名字),定義該欄位將會獲取文件的類型
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception {
/*HttpServletRequest req = ServletActionContext.getRequest();
String root = req.getRealPath("/upload");//找到文件需要存儲的路徑
*/
String root = ServletActionContext.getServletContext().getRealPath("/upload");//和上面注釋的一樣,都能獲得絕對路徑
InputStream is = new FileInputStream(file);//FileInputStream就從文件系統中的某個文件中獲得輸入位元組。通過打開一個到實際文件的連接來創建一個 FileInputStream
System.out.println("fileFileName: "+fileFileName);//列印一下來獲得文件名
File destFile = new File(root, fileFileName);//創建一個目標文件,指定目標文件的位置和文件名
OutputStream os = new FileOutputStream(destFile);//創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。
byte[] buffer = new byte[4096];
int length=0;
while((length=is.read(buffer))!=-1){//從輸入流中讀取數據的下一個位元組;如果到達流的末尾,則返回 -1
os.write(buffer, 0, length);
/*將指定 byte 數組中從偏移量 0 開始的 length 個位元組寫入此輸出流。
元素 b[0] 是此操作寫入的第一個位元組,b[length-1] 是此操作寫入的最後一個位元組。*/
}
is.close();
os.close();
return SUCCESS;
}
}
4.文件上傳結果頁面,用於顯示結果信息(fileUploadResult.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文件上傳結果頁面</title>
</head>
<body>
username:<s:property value="username"/><br/>
name:<s:property value="fileFileName"/><br/>
type:<s:property value="fileContentType"/><br/>
</body>
</html>
5. struts2配置文件(struts.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="struts2" namespace="/" extends="struts-default">
<action name="fileupload" class="com.zlc.struts2.UploadAction">
<result name="success">/fileUploadResult.jsp</result>
</action>
</package>
</struts>
6.注意一點,別忘了在項目的WebRoot下面建立一個文件夾upload,用以存放上傳的文件
7.在地址欄里輸入http://localhost:8080/Struts2/fileUpload.jsp進行驗證,jar文件是可以上傳的
9. struts2文件上傳
可以用隨機函數,得到一個隨機數,再加上當前的時間,作為一個符號串當文件的文件名,然後把上傳的文件取得原來的文件名,截取原來文件名的後綴名,記得連點一起截取,這樣就可以把剛才的隨機數加時間再加截取得的後綴名作為新的文件名;代碼如下:其在action是這樣:package huan.lin.shopaction;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Random;import org.apache.struts2.ServletActionContext;import huan.lin.shopbean.Shop;
import huan.lin.shopservice.Shopservice;import com.opensymphony.xwork2.ActionSupport;public class Saveshopaction extends ActionSupport {
private static final long serialVersionUID = -7387264205534303757L; private Shopservice shopservice; private String spname;
private String sppaizi;
private String spms;
private String sppicurl;
private String sphave;
private double spprice;
private File file;
private String fileFileName;
private String fileContentType; @SuppressWarnings("deprecation")
public String execute() throws Exception {
//文件上傳
long time = new Date().getTime();
Random ran = new Random();
int newran = ran.nextInt(10000);
InputStream is = new FileInputStream(file);
String sub = this.getFileFileName();
String subname = sub.substring(sub.lastIndexOf(".", sub.length()));
String filename = time + "" + newran + subname;
String root = ServletActionContext.getRequest().getRealPath("/uploadsmallimage");
File destFile = new File(root, filename);
OutputStream os = new FileOutputStream(destFile);
byte[] buffer = new byte[4000];
int length = 0;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
is.close();
os.close();
//數據保存 Shop shop = new Shop();
shop.setSpname(spname);
shop.setSppaizi(sppaizi);
shop.setSpprice(spprice);
shop.setSphave(sphave);
shop.setSpms(spms);
shop.setSppicurl(filename); this.getShopservice().save(shop);
return SUCCESS;
}
public Shopservice getShopservice() {
return shopservice;
} public void setShopservice(Shopservice shopservice) {
this.shopservice = shopservice;
} public String getSpname() {
return spname;
} public void setSpname(String spname) {
this.spname = spname;
} public String getSpms() {
return spms;
} public void setSpms(String spms) {
this.spms = spms;
} public String getSppicurl() {
return sppicurl;
} public void setSppicurl(String sppicurl) {
this.sppicurl = sppicurl;
} public String getSphave() {
return sphave;
} public void setSphave(String sphave) {
this.sphave = sphave;
}
public File getFile() {
return file;
} public void setFile(File file) {
this.file = file;
} public String getFileFileName() {
return fileFileName;
} public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
} public String getFileContentType() {
return fileContentType;
} public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
} public double getSpprice() {
return spprice;
} public void setSpprice(double spprice) {
this.spprice = spprice;
}
public void validate()
{
}
public String getSppaizi() {
return sppaizi;
}
public void setSppaizi(String sppaizi) {
this.sppaizi = sppaizi;
}
}
在servlet中如下: package huan.lin;import java.io.IOException;
import java.sql.SQLException;import java.util.Date;
import java.util.Random;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;import org.apache.commons.dbutils.QueryRunner;import com.jspsmart.upload.File;
import com.jspsmart.upload.Files;
import com.jspsmart.upload.SmartUpload;public class PhotouploadServlet extends HttpServlet { private static final long serialVersionUID = -806574948649837705L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
Users users = (Users) session.getAttribute("users");
if (users == null) {
response.sendRedirect("/lin01/admin/login.jsp");
} else {
request.setCharacterEncoding("utf-8");
String newname = "";
// 新建一個SmartUpload對象
SmartUpload su = new SmartUpload();
// 上傳初始化 su.initialize(this.getServletConfig(), request, response);
// 限制每個上傳文件的最大長度。 su.setMaxFileSize(600000);
// 限制總上傳數據的長度。
// su.setTotalMaxFileSize(200000);
// 設定允許上傳的文件(通過擴展名限制),僅允許doc,txt文件。
su.setAllowedFilesList("jpeg,gif,jpg,bmp"); try { su.upload(); Files fes = su.getFiles();
File fe = fes.getFile(0);
String name = fe.getFileName();
String subname = name.substring(name.lastIndexOf("."), name
.length());
long time1 = new Date().getTime();
Random ran = new Random();
int newran = ran.nextInt(10000);
newname = time1 + "" + newran + subname;
ServletContext sc = this.getServletContext();
String path = sc.getRealPath("upload");
fe.saveAs(path+"/"+newname); InitialContext ctx = null;
try {
ctx = new InitialContext();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DataSource ds = null;
try {
ds = (DataSource)ctx.lookup("java:comp/env/jdbc/rollerdb");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int result = 0; try { String sql = "insert into photo (name) values (?)"; String params[] = { newname };
// DButils中核心類,生成對象時傳遞數據源對象
QueryRunner qr = new QueryRunner(ds); result = qr.update(sql, params);
} catch (SQLException e) {
e.printStackTrace();
}
String message = "";
if (result == 1) {
message = "Congratulation to you(恭喜你),上傳成功!";
} else {
message = "Sorry,上傳失敗!";
} request.setAttribute("message", message); request.getRequestDispatcher("/photouploadsuccess.jsp").forward(request,
response); } catch (Exception e) {
response.sendRedirect("/lin01/uploadphotoerror.jsp");
} }
}}
10. javaee 用struts2的文件上傳,保存才伺服器目錄下 伺服器是tomcat 為什麼電腦重啟後 文件就沒有了
首先,
文件上傳到伺服器是保存在磁碟上的,磁碟是永久性存儲介質,如果不是手動刪除或者中毒(這種可能性不大),是不會丟失的。你可能是上次運行的時候上傳的文件在伺服器中,後來被你重新發布項目把原項目直接覆蓋掉了,因為你原項目中可能沒有存你新發布的圖片,所以直接丟失掉了,建議如果有重要的上傳文件,先將已經上傳的文件備份一下,再發布新的項目。或者是你發布新文件的時候設置一下那個發布選項,只覆蓋舊文件,不要全部刪除後上傳新項目,如圖