java文件上传和下载

一、文件上传

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();
    }





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值