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();
}
}
}
希望帮到你
