Java文件上传下载

文件上传

1.form提交
 <form action="upload" enctype="multipart/form-data" method="post">
        请选择文件:<input type="file" name="file">
        <input type="submit" value="上传">
    </form>
2.UploadServlet
/**
步骤:
 1.request读取数据流并存储为临时文件
 2.解析临时文件内容
     由于读取的数据流不仅仅包含文件信息。
     以上传内容为 hello 的 .txt 文件为例
     临时文件的内容为:
         -----------------------------2185749228913
        Content-Disposition: form-data; name="file"; filename="test.txt"
        Content-Type: text/plain

        hello
        -----------------------------2185749228913--
 3.创建上传的文件
*/
 @WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public UploadServlet() {
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*-------客户端数据转换成临时文件--------------*/
        //文件输入流
        InputStream in = request.getInputStream();
        //创建一个临时文件存储输入流数据
        String tmpFileName = "E:/tempFile";
        File tempFile = new File(tmpFileName);
        //输出流
        FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
        //指定一次读入的长度
        byte tmp[] = new byte[1024];
        int n;
        //将数据输入到临时文件中
        //n为实际读入的长度
        while((n = in.read(tmp)) != -1){
            //写入从tmp[0]到tmp[n]
            fileOutputStream.write(tmp,0,n);
        }


        /*-------临时文件生成上传的文件--------------*/
        RandomAccessFile randomAccessFile = new RandomAccessFile(tempFile, "r");
        randomAccessFile.readLine();
        String fileName = randomAccessFile.readLine();
        //获取文件名
        fileName = fileName.substring(fileName.lastIndexOf("=")+2,fileName.lastIndexOf("\""));
        System.out.println(fileName);

        //将文件指针重新定位到文件头
        randomAccessFile.seek(0);
        //起始位置
        long startPosition = 0;
        //获取文件内容 开头位置
        int i = 1;
        while((n = randomAccessFile.read()) != -1 && i<=4) {
            if(n == '\n'){
                startPosition = randomAccessFile.getFilePointer();
                i++;

            }
        }
        //由于read()一次之后指针已经指向了下一个下标,所以减 1  
        startPosition-=1;

        //将文件指针重新定位到文件尾
        randomAccessFile.seek(randomAccessFile.length());
        //结束位置
        long endPosition = randomAccessFile.getFilePointer();
        int j=1;
        //获取文件内容 结束位置
        while(endPosition >= 0 && j<=2){
            endPosition--;
            randomAccessFile.seek(endPosition);
            if(randomAccessFile.readByte() == '\n'){
                j++;
            }
        }
        endPosition--;
        //服务器上保存文件的位置
        String realPath = this.getServletContext().getRealPath("/") + "upload";

        File fileupload = new File(realPath);
        //新建一个文件夹
        if(!fileupload.exists()){
            fileupload.mkdir();
        }
        //建立文件
        File savedFile = new File(realPath,fileName);
        RandomAccessFile savedRandomAccessFile = 
                new RandomAccessFile(savedFile, "rw");
        randomAccessFile.seek(startPosition);
        //从临时文件中写入内容
        while(startPosition<endPosition){
            savedRandomAccessFile.write(randomAccessFile.readByte());
            startPosition++;
        }
        //关闭流并删除临时文件
        savedRandomAccessFile.close();
        randomAccessFile.close();
        fileOutputStream.close();
        in.close();
        tempFile.delete();

    }

}

文件下载

1.DownloadServlet
@WebServlet("/download")
public class DownloadServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{
        String filePahtOnServer = getServletContext().getRealPath("/upload/test.txt");
        File fileOnServer = new File(filePahtOnServer);
        FileInputStream readFileStream =null;
        OutputStream outputStream = null;
        if(fileOnServer.exists()){
                //设置相应的类型
                response.setContentType("application/x-msdownload");
                response.setHeader("Content-Disposition", "attachment;filename=test.txt");
                readFileStream = new FileInputStream(fileOnServer);
                outputStream = response.getOutputStream();
                byte b[] = new byte[1024];
                int n;
                while((n = readFileStream.read(b)) != -1){
                    outputStream.write(b);
                }


                outputStream.close();
                readFileStream.close();
                request.setAttribute("result", "文件下载成功");
        }else{
            request.setAttribute("result", "文件下载失败");
        }
        request.getRequestDispatcher("download.jsp").forward(request, response);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值