Servlet演示文件上传和下载(打乱文件目录)

下载文件的代码:
步骤

//1、 准备在显示的图片名
String name = "我的图片.jpg";
//2、如果是中文名必须转码
name = URLEncoder.encode(name,"UTF-8");
//3、获取真实的文件
String path = getServletContext().getRealPath("/a.jpg");
//4、设置显示类型为下载
resp.setContentType("application/force-download");
//5、设置响应头
resp.setHeader("Content-Disposition","attachment;filename=\""+name+"\"");
//6、以下是模板代码I/O
InputStream in = new FileInputStream(path);
byte[] b = new byte[1024];
int len = 0;
OutputStream out = resp.getOutputStream();
while((len=in.read(b))!=-1){
    out.write(b,0,len);
}

例子:

package cn.hncu.servlet2;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

/**
 * Created by jan on 2016/7/20.
 */
@WebServlet(value = "/down",name = "DownServlet")
public class DownServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应头--内容接收程序--浏览器看到这个响应头,就会把它认为的下载程序打开(如果识别迅雷那么就会自动打开迅雷,如果没有其它的则打开一个“文件另存为”的对话框
        response.setContentType("application/force-download");
        //设置响应头--告诉浏览器:文件名+文件类型
        String fileName="你好.jpg";
        //解决中文文件名乱码问题(只要用下面一句对文件名进行编码就行了)
        fileName= URLEncoder.encode(fileName,"utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=\""+fileName+"\"");//注意,“attachment;” 不能少,否则浏览器会直接在新窗口中打开
        //注意,“attachment;” 不能少,否则浏览器会直接在新窗口中打开
        //向浏览器发送要下载的文件数据
        String relpath=getServletContext().getRealPath("/imgs/1.jpg");//真正下载的文件数据在这里
        InputStream in=new FileInputStream(relpath);
        OutputStream out=response.getOutputStream();
        byte buf[]=new byte[1024];
        int len;
        while ((len=in.read(buf))!=-1){
            out.write(buf,0,len);
        }
        out.close();
        in.close();

    }
}

上传文件:
表单:
客户端发送HTTP必须使用multipart/form-data数据类型,表示复合数据类型。
即:
在表单中使用html标签。
需要的包:
Commons-fileupload.jar,核心上传文件工具都在这个包中。
commons-io.jar – 上传文件所需要的包
例子:
上传文件。
打散。
显示所有已经上传的文件。
实现指定文件名的下载。

package cn.hncu.updown;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.UUID;

/**
 * Created by jan on 2016/7/22.
 */
@WebServlet(name = "UploadServlet3",value = "/upload3")
public class UploadServlet3 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().println("不支持GET方式上传");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //※下面这句解决上传文件名的中文乱码
        //注意,下面这句设置中文,如果是“multipart/form-data”表单,可以设置其中file组件的文件名,但对其中的普通表单组件无效。
        //注意,下面这句设置中文,如果是我们以前用的“application/x-www-form-urlencoded”表单,可以设置其中的普通表单组件。
        response.setContentType("text/html;charset=utf-8");
        final PrintWriter out = response.getWriter();
        String path = request.getServletContext().getRealPath("/imgs");
        //☆防黑2--非multipart表单提交
        //手动方式
        /*String type=request.getContentType();
        if(!type.equals("multipart/form-data")){
            out.print("不支持普通表单提交!");
            return;
        }*/
        boolean boo = ServletFileUpload.isMultipartContent(request);
        if (!boo) {
            out.print("不支持普通表单提交!");
            return;
        }
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //先获取所接收文件要保存的路径
        factory.setRepository(new File("g:/a"));//文件上传需要临时目录(如果不指定,那么该目录就是tomcat/temp )
        factory.setSizeThreshold(1024 * 8);//设置缓冲区的位置和大小
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setFileSizeMax(1024 * 1024 * 5);//设置每个文件最大为5M
        upload.setSizeMax(1024 * 1024 * 80);//所有上传文件大小之和的最大值,此处设最多能上传80M
        upload.setHeaderEncoding("utf-8");//用于设置文件名的编码,相当于:request.setCharacterEncoding("utf-8");
        //☆文件上传进度功能---设置监听器

        upload.setProgressListener(new ProgressListener() {
            private  int pre=0;
            @Override//参数解析---- pBytesRead:已上传字节数   pContentLength:pBytesRead   pItems:文件序号(从1开始的)
            public void update(long pBytesRead, long pContentLength, int pItems) {
                double d = pBytesRead*100.0/pContentLength;//计算百分比
                int dd=(int)d;
                if(pre!=dd){
                    out.print(dd+"%<br/>");
                    pre=dd;
                }
            }
        });
        //以下开始解析
        FileItem fi2 = null;
        try {

            List<FileItem> list = upload.parseRequest(request);
            for (FileItem fi : list) {
                fi2 = fi;
                if(fi.isFormField()){//普通表单组件
                    String str = fi.getString("utf-8");
                    System.out.println("普通表单组件提交的内容:"+str);
                }else {//表单中的:file组件

                    String fileName = fi.getName();
                    String ext = fileName.substring(fileName.lastIndexOf("."));
                    //文件名不能用中文,必须转换成ascii码的格式,而且文件名不能重复(必须保证唯一),因此采用UUID来实现
                    String newFileName = UUID.randomUUID().toString().replace("-", "") + ext;
                    //☆打散目录(因为对于普通机器,一个文件夹如果存储的文件个数超过1000,性能将会急剧下降!! )
                    String dir1 = Integer.toHexString(fileName.hashCode() & 0xf);
                    String dir2 = Integer.toHexString((fileName.hashCode() & 0xf0) >> 4);
                    File dir = new File(path + "/" + dir1 + "/" + dir2);
                    if (!dir.exists()) {
                        dir.mkdirs();
                    }
//                FileUtils.copyInputStreamToFile(request.getInputStream(),new File(dir,newFileName));
                    fi.write(new File(dir, newFileName));
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fi2 != null) {
                fi2.delete();//清临时文件
            }
        }
    }

}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值