文件的下载与上传

文件的下载与上传

一、文件下载

文件下载的例子在我们周围很常见,这里用java代码实现一个文件下载的例子。
1.想要下载某个文件,我们需要知道资源的路径。

//文件资源的地址
String path ="http://localhost:8080/hello/info.txt";
//将地址转化为url
URL url =new URL(path);  

2.利用这个url打开一个远程链接,然后获取响应码。

//打开链接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
//获得响应码
int code = connection.getResponseCode();  

这里我们还可以设置range,来实现对文件部分下载的功能。如果设了range,我们在获取请求码时就不能用200,而应该用206.

connection.addRequestProperty("range", "bytes:-1000");

3.获取到响应码之后,开始读取数据,然后将数据写到本地

if(code == 206){
    InputStream is = connection.getInputStream();
    FileOutputStream fos =new FileOutputStream("info.txt");
    int length=0;
    byte[] buff=new byte[1024];
    while((length=is.read(buff))!=-1){
        fos.write(buff, 0, length);
    }
    is.close();
    fos.close();
    System.out.println("下载完成");
}
二、文件上传

这里我们采用apache fileupload第三方框架的方式将文件上传。

  1. 导入相应的架包。commons-fileupload-1.2.2.jar,commons-io-2.0.1.jar
  2. 构建磁盘文件工厂。

    //1.构建磁盘文件工厂  
    DiskFileItemFactory factory =new DiskFileItemFactory();  
    
  3. 通过文件工厂获取一个文件上传的核心类

    //2.通过文件工厂获取一个文件上传的核心类
    ServletFileUpload fileUpload =new ServletFileUpload(factory);  
    
  4. 解析request,返回List

    try {
        List<FileItem> fileItems = fileUpload.parseRequest(request);
        //循环取出每个fileItem
        for (FileItem fileItem : fileItems) {
            if(fileItem.isFormField()){
                //是普通项
                String fieldName =fileItem.getFieldName(); 
                String name =fileItem.getString();
                System.out.println(fieldName+"   "+name);
            }else{
                //文件上传项
                String name =fileItem.getName();//文件名
                InputStream is = fileItem.getInputStream();
                FileOutputStream fos =new FileOutputStream("i:\\"+name);
                int length=0;
                byte[]buff=new byte[1024];
                while((length=is.read(buff))!=-1){
                    fos.write(buff, 0, length);
                }
                is.close();
                fos.close();
    
            }
        }    
    

    这里我们就基本上将上传的功能完成了。然后我们还可以将功能完善一下。当上传的文件过大是,我们可以设置缓存。

    //添加缓存
    factory.setSizeThreshold(1024*1024);
    //获取绝对路径
    String realPath =getServletContext().getRealPath("temp");
    factory.setRepository(new File(realPath));   
    

    这里我们需要先在项目的工作区间里创建一个temp文件夹。然后我们还需要在关闭了流资源之后,将这些缓存文件删掉。

    fileItem.delete();  
    

    最后还两个小问题,也是很重要的问题。
    (1).个就是我们在将数据提交到servlet的时候,我们的表单必须是以post请求提交数据,而且还要添加一个属性enctype。

    <form action="/fileDown/MyServlet" method="post" enctype="multipart/form-data">
    

(2).如果文件名中有中文,我们不进行处理的话,就会出现乱码的问题,所以我们在得到核心类后进行编码设置。

    fileUpload.setHeaderEncoding("UTF-8");  

OK,搞定!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值