servlet文件上傳
上傳:
需要導入兩個包:commons-fileupload-1.2.1.jar,commons-io-1.4.jar
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* 上傳附件
* @author new
*
*/
public class UploadAnnexServlet extends HttpServlet {
private static String path = "";
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
/*
* post處理
* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
path = this.getServletContext().getRealPath("/upload");
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload up = new ServletFileUpload(factory);
List<FileItem> ls = up.parseRequest(request);
for (FileItem fileItem : ls) {
if (fileItem.isFormField()) {
String FieldName = fileItem.getFieldName();
//getName()返回的是文件名字 普通域沒有文件 返回NULL
// String Name = fileItem.getName();
String Content = fileItem.getString("gbk");
request.setAttribute(FieldName, Content);
} else {
String nm = fileItem.getName().substring(
fileItem.getName().lastIndexOf("\\") + 1);
File mkr = new File(path, nm);
if (mkr.createNewFile()) {
fileItem.write(mkr);//非常方便的方法
}
request.setAttribute("result", "上傳文件成功!");
}
}
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("result", "上傳失敗,請查找原因,重新再試!");
}
request.getRequestDispatcher("/pages/admin/annex-manager.jsp").forward(
request, response);
}
}
下載(i/o流)無需導包:
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 下載文件
* @author
*
*/
public class DownloadFilesServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 8594448765428224944L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
/*
* 處理請求
* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("fileName");
System.out.print("dddddddddd:" + name);
// web絕對路徑
String path = request.getSession().getServletContext().getRealPath("/");
String savePath = path + "upload";
// 設置為下載application/x-download
response.setContentType("application/x-download");
// 即將下載的文件在伺服器上的絕對路徑
String filenamedownload = savePath + "/" + name;
// 下載文件時顯示的文件保存名稱
String filenamedisplay = name;
// 中文編碼轉換
filenamedisplay = URLEncoder.encode(filenamedisplay, "UTF-8");
response.addHeader("Content-Disposition", "attachment;filename="
+ filenamedisplay);
try {
java.io.OutputStream os = response.getOutputStream();
java.io.FileInputStream fis = new java.io.FileInputStream(
filenamedownload);
byte[] b = new byte[1024];
int i = 0;
while ((i = fis.read(b)) > 0) {
os.write(b, 0, i);
}
fis.close();
os.flush();
os.close();
} catch (Exception e) {
}
}
}
『貳』 如何在servlet得到jsp上傳的文件的文件名
可以使用commons-fileupload組件實現文件上傳,步驟如下:
1、添加jar包:commons-fileupload-x.x.x.jar和commons-io-2.4.jar
2、編寫或修改form表單
1) 提交方式必須是post
2) 為表單增加屬性enctype="multipart/form-data"
3) 為文件上傳單獨提供servlet,因為增加enctype屬性後,無法使用常規的請求對象來獲取提交的數據
3、使用Commons-FileUpload組件實現文件的上傳
1) 確定本次請求是否是文件上傳請求
boolean flag=ServletFileUpload.isMultipartContent(request);
2) 創建文件上傳的工廠對象
FileItemFactory factory=new DiskFileItemFactory();
3) 創建ServletFileUpload對象,並將工廠對象作為參數傳入
ServletFileUpload upload=new ServletFileUpload(factory);
4) 使用上傳對象從請求對象中解析出提交的所有表單元素
List<FileItem> lstForms=upload.parseRequest(request);
5) 遍歷表單元素集合,實現取出表單元素和上傳文件
//遍歷所有表單元素
for (FileItem fileItem : lstForms) {
//判斷每一個表單元素是否是普通表單
if(fileItem.isFormField()){
System.out.println(fileItem.getString("UTF-8"));
}else{
//上傳前准備工作
//a、上傳後的路徑this.getServletContext().getRealPath("/")會出去當前項目在 部署的伺服器上的絕對路徑
String path=this.getServletContext().getRealPath("/")+"files/";
//b、找出要上傳的文件的名字
String fileName=fileItem.getName();
fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
//c、上傳
fileItem.write(new File(path+fileName));
out.println("<h2>"+fileName+"上傳成功!</h2>");
『叄』 Servlet實現文件上傳時候出現了錯誤,緊急求救!!
你有沒設置表單伍答的類型?
沒喚畝有的話加上腔鏈慧 enctype="multipart/form-data"
『肆』 javaweb中實現文件上傳完整代碼(servlet裡面dopost的代碼)
structs
的
jsp
頁面文件上傳表單,只要項目是SSH的就行了
jsp:
<s:form
action="add.do"
id="inputForm"
enctype="multipart/圓孫form-data"扒猜
>
<td
>
<s:file
name="upload"
cssClass="{required:true}"
contenteditable="false"></s:file>
<span
class="field_tipinfo">請選擇文件</span>
</td>
</s:form
action:
private
File
upload;//上傳的文件
....
public
String
add()
throws
Exception
{
//保存文件橘此鏈
save(upload);
}
...
『伍』 jsp+servlet上傳圖片和文字時,中文亂碼
轉碼可以在頁面中或是sevlet以及過濾都可以解決的,下面以頁面和servlet為例:
方法一:設置 request 和 response 的編碼 [ 頁面編碼必須為 u8 ]
request.setCharacterEncoding("UTF-8");//傳值編碼
response.setContentType("text/html;charset=UTF-8");//設置傳輸編碼
方法二:
String str1=傳來的數據。
String ss=new String(str1.getBytes("ISO-8859-1"),"utf-8"); //轉碼UTF8
『陸』 JSP+Servlet上傳圖片問題
其實你這個擋也顯示圖片其實很簡單的,
你的需求無非是兩個
1.servlet上傳文件(圖片巧州)
2.點擊 瀏覽 圖標,然後選擇圖片文件,然後就可以在頁面中的某個地方看到圖片
是這兩個需求沖戚么?
首先說第二個吧。
你上傳孝判蔽圖片之後,就馬上觸發js函數,內容為
var PicPath = document.getElementById("yourfile").value;
document.getElementById("yourDiv").innerHTML="<IMG src="+PicPath+"/>";
OK了
第一個嘛就無所謂說了,不過我還是貼一個代碼吧,
public void upLoadFile(HttpServletRequest request, HttpServletResponse response) {
PrintWriter out = null;
response.setCharacterEncoding("UTF-8");
//實例化文件工廠
FileItemFactory factory = new DiskFileItemFactory();
//配置上傳組件ServletFileUpload
ServletFileUpload upload = new ServletFileUpload(factory);
try {
out = response.getWriter();
//從request得到所有上傳域的列表
List<FileItem> list = upload.parseRequest(request);
for (FileItem item : list) {
//isFormField判斷一個item類對象封裝的是一個普通的表單欄位還是文件表單欄位。
// 如果item是文件域,則做出如下處理:
if (!item.isFormField()) {
//上傳文件域的Name
String fileName = item.getName();
//截取擴展名
int idx = fileName.lastIndexOf(".");
String extension = fileName.substring(idx);
//獲取文件名
String name = new Date().getTime() + extension;
//得到文件夾的物理路徑
String path = this.getServletContext().getRealPath("\\upload");
//創建一個File
File file = new File(path + "\\" + name);
FileOutputStream o = new FileOutputStream(file);
InputStream in = item.getInputStream();
try {
LoadProcessServlet.process = 0;
LoadProcessServlet.total = 100;
LoadProcessServlet.isEnd = false;
LoadProcessServlet.total = item.getSize();
byte b[] = new byte[1024];
int n;
while ((n = in.read(b)) != -1) {
LoadProcessServlet.process+=n;
o.write(b, 0, n);
System.out.println("實際:"+LoadProcessServlet.process);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
LoadProcessServlet.isEnd = true;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
『柒』 ServletFileUpload.isMultipartContent(request)作用
作用有兩個:
1、用於檢測是否一個文件上傳的請求。在fileupload包實現上傳項目前,需要解析一個http請求,為了確保這個殲正請求的確是一個正確的上傳文件,所以組件FileUpload提供了這樣一個靜態的方法。
2、用於判斷是普通表單,還斗並是帶文件上傳的表單,起了辨別的作用。若返回值為true則是帶文件上傳的表單;返回值為false則是普通表單。
(7)servlet文件上傳擴展閱讀
在fileupload中, http請求中的復雜表單元素都會被看作一個FileItem對象,而且FileItem對象必須由ServletFileUpload類中的parseRequest()方法去解析HTTP請求;
再者,ServletFileUpload對象的創建需要依賴於FileItemFactory工廠而獲得的上傳文件FileItem對象保存至服務空改跡器硬碟,也就是指DiskFileItem對象。
『捌』 java中Servlet上傳文件到伺服器指定目錄,報路徑不存在的錯誤,我QQ,394576483
可以在程序中判斷一下該目錄是否存在,如果不鬧悔存在,創建目錄。
Filef=newFile("D:\apache-tomcat-6.0.20\webapps\up1\WEB-INFO\files");
if(!f.exists()){
f.mkdirs();
}
另外搜液,你這個路徑不太好,如果你的war包部署在tomcat上,是沒有解開成一個世彎物目錄,那文件上傳肯定會失敗。建議你換一個實際存在的目錄,用來存放文件。
『玖』 servlet上傳圖片,目錄設置問題
servlet上傳圖片應該保存到WEB-INF目錄下的image目錄核洞,理由是WEB-INF目錄安全,不容易被攻擊。
設置存放臨時文件的目錄,web根目錄下的image目錄寫碧皮法:
實例化一個硬碟文件工廠,用來配置上傳組件ServletFileUpload
DiskFileItemFactory dfif = new DiskFileItemFactory();
//設置上傳文件時用於臨時存放文件的內存大小,這里是4K.多於的部分將臨時悔氏差存在硬碟
dfif.setSizeThreshold(4096);
dfif.setRepository(new File(request.getRealPath("/") + "image"));
『拾』 java servlet不用插件上傳文件:
import java.net.*;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SaveFileServlet extends HttpServlet
{
FileWriter savefile;
String filename = null;
String value = null;
/**
* Handles a POST request
*/
public void doPost(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
PrintWriter out = response.getWriter();
response.setContentType( "text/html ");
//FileWriter savefile;
try {
// Verify the content type
String ct = request.getContentType();
if (!ct.startsWith( "multipart/form-data "))
throw new RuntimeException
( "Invalid content type ");
// Get the boundary string
int p = ct.indexOf( "boundary= ");
if (p == -1)
throw new RuntimeException
( "No boundary string found ");
p += "boundary= ".length();
String boundary = "-- " + ct.substring(p);
String finalBoundary = boundary + "-- ";
// We 'll parse the multipart/form-data
// with a finite state machine
// Define names for the parser states
final int INIT = 0;
final int READING_HEADERS = 1;
final int READING_DATA = 2;
int state = INIT;
// Read and extract the fields
BufferedReader in = request.getReader();
main: for (;;) {
String line = in.readLine();
if (line == null)
break;
switch (state) {
// State 0: Ignoring everything before
// the first boundary
case INIT:
if (line.startsWith(finalBoundary))
break main;
if (line.startsWith(boundary)) {
state = READING_HEADERS;
filename = " ";
value = " ";
}
break;
// State 1: Parsing the headers
case READING_HEADERS:
if (line.length() == 0)
state = READING_DATA;
else {
// Get the field name
p = line.indexOf( "filename=\ " ");
if (p == -1)
break;
p += "filename=\ " ".length();
// ... up to the closing quote.
int q = line.indexOf( "\ " ", p);
if (q == -1)
break;
filename = line.substring(p, q);
filename= "./config/medet/applications/DefaultWebApp/ "+filename.substring(filename.lastIndexOf( "\\ ")+1);
savefile=new FileWriter(filename);
value = " ";
}
break;
// State 2: Reading the data
case READING_DATA:
if (line.startsWith(finalBoundary)) {
savefile.write(value);
savefile.close();
break main;
}
if (line.startsWith(boundary)) {
state = READING_HEADERS;
}
else {
if (value.length() > 0)
value += "\n ";
value += line;
}
break;
}
}
// Report the incident number back to the client
String[] text = {
" <HTML> ",
" <HEAD> ",
" <meta http-equiv= 'Content-Type ' content= 'text/html; charset=gb2312 '> ",
" <TITLE> 文件上傳成功 </TITLE> ",
" </HEAD> ",
" <BODY> ",
" <CENTER> ",
" <H3> 文件上傳成功! </H3> ",
" </CENTER> "
};
for (int i = 0; i < text.length; i++)
out.println(text[i]);
out.println(filename);
out.println( " </BODY> ");
out.println( " </HTML> ");
}
catch (Exception e) {
// Write the exception message
out.println( " <H3> Error: </H3> ");
out.println( " <PRE> ");
out.println(e.getMessage());
out.println( " </PRE> ");
}
finally {
out.flush();
}
}
}
希望幫到你