您的位置:首页 > 编程语言 > Java开发

java文件上传和下载

2014-04-01 14:50 381 查看
一、文件上传
1.Commons方式文件上传
首先导入包commons-fileupload-1.2.jar和commons-io-1.3.2.jar,web文件上传使用post方式,设置form的enctype属性为multipart/form-data由于上传的文件会比较大,因此需要设置该参数指定浏览器使用二进制上传。提交上传文件后可以在提交过去的页面获得一个输入流request.getInputStream()输入流中时文件的字节码,可以将其包装为字符流输出。
文件上传首先要定义一个对象:
DiskFileItemFactory dfif=newDiskFileItemFactory();
在该对象中设置两个属性:
dfif.setSizeThreshold(1024*1024); //文件上传时缓存得最大容量
dfif.setRepository(new File(path));//当上传文件大于缓存容量时暂存到该目录下。
String path=request.getRealPath("/upload");//获得当前应用下WebRoot下一个文件夹的路径。
通过factory构造一个ServletFileUpload对象实现文件上传:
ServletFileUpload sfu=new ServletFileUpload(dfif);
获得提交的每个元素的信息:
List<FileItem> list=sfu.parseRequest(request);
遍历list找出不是普通文本域的表单元素信息:
if(!fileItem.isFormField()){ //判断是否文普通文本域
获得文件名:
String value = fileItem.getName();
int stat = value.lastIndexOf("\\");
String filename=value.substring(stat+1);
将文件写入到指定路径:
fileItem.write(new File(path,filename));//直接将文件写入指定的路径
获得表单的名字:fileItem.getFieldName()
获得表单里面的内容:fileItem.getString()
如下例子:
jsp中设置代码:

<form action="/firstWeb/UploadServlet"method="post" enctype="multipart/form-data">
<label>请选择上传文件:</label>
<input type="file"name="file1"><br/>
<label>请选择上传文件:</label>
<input type="file"name="file2"><br/>
<label>请输入第一个文件简介:</label>
<input type="text" name="description1"><br>
<label>请输入第二个文件简介:</label>
<input type="text"name="description2"><br>
<input type="submit"value="上传">
</form>


servlet中代码:

Stringfile1=null,file2=null,description1=null,description2=null;
DiskFileItemFactory dfif=new DiskFileItemFactory();
Stringpath=getServletContext().getRealPath("/upload"); //获得应用下WebRoot下的文件目录
dfif.setRepository(newFile(path));//设定目录用来暂时存放文件是大于配置的尺寸
dfif.setSizeThreshold(1024*1024);//设定阈值超过此文件大小都写直接到磁盘
ServletFileUpload sfu=newServletFileUpload(dfif);
sfu.setSizeMax(1024*10);//设置允许上传文件的最大值
sfu.setSizeMax(1024*10*10);//设置上传总量大小
//sfu.setHeaderEncoding("UTF-8");//文件名出现中文乱码使用
//显示文件上传进度
ProgressListener progressListener= new ProgressListener() {
publicvoid update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("到现在为止,  " +pBytesRead + " 字节已上传,总大小为 "
+ pContentLength);
}
};
sfu.setProgressListener(progressListener);
try {
List<FileItem>list=sfu.parseRequest(request);//获得request提交的所有表单信息
for(FileItemfileItem:list){
if(!fileItem.isFormField()){  //判断是否文普通文本域
Stringname =fileItem.getFieldName();
if(name.equals("file1")){
file1=name;
}
if(name.equals("file2")){
file2=name;
}
//获得文件的名字
Stringvalue = fileItem.getName();
intstat = value.lastIndexOf("\\");
Stringfilename =value.substring(stat+1);
fileItem.write(newFile(path, filename));//直接将文件写入指定的路径
}else{
if("description1".equals(fileItem.getFieldName())){
description1=newString(fileItem.getString().getBytes(),"UTF-8");
}elseif ("description2".equals(fileItem.getFieldName())) {
description2=newString(fileItem.getString().getBytes(),"UTF-8");
}
}
}
}catch (Exception e) {
e.printStackTrace();
}


2.jspSmart文件上传
首先导入包jspsmartuploadUTF-8.jar
jsp中代码:

<formaction="SmartUploadServlet" method="post"enctype="multipart/form-data">
<input type="file"name="file1"><input type="submit" value="确定">
</form>


servlet中代码:

request.setCharacterEncoding("UTF-8");
String path=this.getServletContext().getRealPath("/upload");
SmartUpload su=new SmartUpload();
//su.setAllowedFilesList("");//设置允许上传指定扩展名的文件否则抛出异常
//su.setDeniedFilesList("");//设置禁止上传指定扩展名的文件
//su.setMaxFileSize(1024*1024*10);//设置允许上传的每个文件的最大长度
//su.setTotalMaxFileSize(1024*1024*20);//设置一次允许上传的所有文件的最大长度
su.initialize(getServletConfig(),request,response);
try
{
su.upload();
//Requestreq=su.getRequest();//取得Request对象,以便由此对象取得文件表单内容
Filesfs= su.getFiles();//获得上传文件的列表
//fs.getCollection();//Collection集合形式获得上传文件列表
//fs.getEnumeration();//获得文件类表的枚举
//fs.getCount();//文件列表的长度
//fs.getSize();//文件列表中文件总长度
Filef=fs.getFile(0);//获得类表中指定序列的文件
Stringfilename=f.getFileName();//获取被上传的文件名
//filename=newString(filename.getBytes("ISO-8859-1"),"UTF-8");
//booleanb=f.isMissing();//判断用户是否上传了文件
//Stringfieldname=f.getFieldName();//此上传文件的表单项name
//Stringext=f.getFileExt();//获取被上传文件的扩展名
//Stringfullname=f.getFilePathName();//获取上传文件的全名含目录
System.out.println(filename);
//intn=f.getSize();//获取上传文件的长度
f.saveAs("/upload/"+filename,SmartUpload.SAVE_VIRTUAL);//将文件另存为(第一个是另存为相对本应用的路径加上文件名)
//su.save("/upload", SmartUpload.SAVE_VIRTUAL);//保存相对本应用的路径不加文件名
} catch (SmartUploadException e)
{
e.printStackTrace();
}


3.struts中文件上传,一定要注意在action中添加文件属性、文件类型属性、文件名称属性且这些属性的名字是固定写法,前半部分时jsp中上传表单中file的name属性,后半部分是固定的写法。当上传多个文件时,action中定义的属性就是数组形式。

jsp中代码:

<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post">
<input  type="file"name="uploadImage">
</form>


action中代码:其主要目的就是将action中得到file文件写入到本地文件中,也可以用流的方式先获得inputStream然后将inputStream中的内容写入到outputStream中进而输出到本地文件中。

public class HelloWorldAction{
private File uploadImage;//得到上传的文件
private String uploadImageContentType;//得到文件的类型
private String uploadImageFileName;//得到文件的名称
//这里略省了属性的getter/setter方法
public Stringupload() throws Exception{
Stringrealpath = ServletActionContext.getServletContext().getRealPath("/images");
Filefile = new File(realpath);
if(!file.exists()) file.mkdirs();
FileUtils.copyFile(uploadImage,new File(file, uploadImageFileName));
return"success";
}
}


4.文件上次进度条实现原理

实现原理时服务器在处理上传文件的同时,将上传进度的信息例如文件长度、已上传多少、传送速率等写入Session中。客户端浏览器利用Ajax技术再新开一个独立的线程从Session中获取上传进度信息,并实时显示,Ajax技术能够不刷新页面获取服务器数据。

二、文件下载

1.servlet中文件下载:

读取web应用中的资源时:用servletContext去获取,可以获得资源的流,也可以获取资源的路径。

首先获得下载文件的路径和名字

String path = this.getServletContext().getRealPath(
"/download/Koala.jpg");
String filename =path.substring(path.lastIndexOf("\\") + 1);
//如果下载文件是中文名称文件,则文件名需经过url编码
filename = URLEncoder.encode(filename, "UTF-8");
//设置浏览器弹出对话框提示下载此文件
response.setHeader("content-disposition","attachment;filename="+filename);
//使用response的getOutputStream方法获得到浏览器的输出流
FileInputStream fis = newFileInputStream(new File(path));
OutputStream out =response.getOutputStream();
byte[] b = new byte[512];
int n = 0;
while ((n = fis.read(b)) != -1) {
out.write(b,0,n);
}
fis.close();
out.close();


根本思路就是将服务器的资源写到写入到response的outPutStream中在servlet的doPost方法中实现下面代码

String name =request.getParameter("name");//获得要下载的文件名字
Stringfilename = new String(name.getBytes("ISO-8859-1"),"UTF-8");
Stringpath =getServletContext().getRealPath("/upload/" + filename +"");//要下载文件路径
filename=URLEncoder.encode(filename,"UTF-8");//如果下载文件名称时中文用url编码
response.reset();
response.setContentType("");//通知浏览器不是普通文本文件和HTML文件而是下载文件
response.setHeader("content-disposition","attachment;filename="
+filename);//通知浏览器接收文件
FileInputStreamfis = new FileInputStream(new File(path));
OutputStreamout = response.getOutputStream();
byte[]b = new byte[1024];
intn = 0;
while((n = fis.read(b)) != -1)
{
out.write(b,0, n);
}
fis.close();
out.close();
return;


下载本地文件

public HttpServletResponsedownload(String path, HttpServletResponse response) {
try {
// path是指欲下载的文件的路径。
File file = new File(path);
// 取得文件名。
String filename = file.getName();
// 取得文件的后缀名。
String ext =filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();

// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(newFileInputStream(path));
byte[] buffer = newbyte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition","attachment;filename=" + new String(filename.getBytes()));
response.addHeader("Content-Length", "" +file.length());
OutputStream toClient = newBufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return response;
}

public void downloadLocal(HttpServletResponseresponse) throws FileNotFoundException {
// 下载本地文件
String fileName ="Operator.doc".toString(); // 文件的默认保存名
// 读到流中
InputStream inStream = newFileInputStream("c:/Operator.doc");// 文件的存放路径
// 设置输出的格式
response.reset();
response.setContentType("bin");
response.addHeader("Content-Disposition","attachment; filename=\"" + fileName + "\"");
// 循环取出流中的数据
byte[] b = new byte[100];
int len;
try {
while ((len = inStream.read(b)) > 0)
response.getOutputStream().write(b, 0, len);
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}


下载网络文件
public voiddownloadNet(HttpServletResponse response) throws MalformedURLException {
// 下载网络文件
int bytesum = 0;
int byteread = 0;
URL url = newURL("windine.blogdriver.com/logo.gif");
try {
URLConnection conn = url.openConnection();
InputStream inStream = conn.getInputStream();
FileOutputStream fs = newFileOutputStream("c:/abc.gif");
byte[] buffer = new byte[1204];
int length;
while ((byteread = inStream.read(buffer)) !=-1) {
bytesum += byteread;
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
} catch (Exception e) {
e.printStackTrace();
}
}


2.smart实现文件下载

publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException
{
//Stringfilename=newString(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
Stringfilename=request.getParameter("filename");
System.out.println(filename);
SmartUploadsu=new SmartUpload();
su.initialize(getServletConfig(),request,response);
su.setContentDisposition(null);
//设定contentDisposition为null以禁止浏览器自动打开文件,
//保证点击链接后是下载文件。若不设定,则下载的文件扩展名为
//doc时,浏览器将自动用word打开它。扩展名为pdf时,
//浏览器将用acrobat打开。
try
{
su.downloadFile("/upload/"+filename);
}catch (SmartUploadException e)
{
e.printStackTrace();
}
}


3.支持在线打开文件

public void downLoad(StringfilePath, HttpServletResponse response, boolean isOnLine) throws Exception {
File f = new File(filePath);
if (!f.exists()) {
response.sendError(404, "Filenot found!");
return;
}
BufferedInputStream br = newBufferedInputStream(new FileInputStream(f));
byte[] buf = new byte[1024];
int len = 0;

response.reset(); // 非常重要
if (isOnLine) { // 在线打开方式
URL u = newURL("file:///" + filePath);
response.setContentType(u.openConnection().getContentType());
response.setHeader("Content-Disposition","inline; filename=" + f.getName());
// 文件名应该编码成UTF-8
} else { // 纯下载方式
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment;filename=" + f.getName());
}
OutputStream out =response.getOutputStream();
while ((len = br.read(buf)) > 0)
out.write(buf, 0, len);
br.close();
out.close();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: