上传与下载功能的实现

本文介绍了一个使用Spring、Struts1.0和Hibernate实现的Oracle数据库BLOB字段上的文件上传和下载功能。通过ServletFileUpload解析请求,将文件保存到BLOB字段,并在下载时从BLOB字段读取内容,设置响应头以触发浏览器下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:Spring+Struts1.0+Hibernate 数据库:Oracle

功能:上传文件并储存未Oracle blob大字段,下载大字段到本地

control:

             /*

              使用common-fileupload包

             */

            ServletFileUpload fileUpload=new ServletFileUpload();
            FileItemIterator items=fileUpload.getItemIterator(req);
       
            while(items.hasNext()){
            FileItemStream item=items.next();
            InputStream stream=item.openStream();//输入流
            String name=item.getFieldName();
            if(item.isFormField()){
            String value=Streams.asString(stream,"gbk");//如果是表单的元素,放进session里
            req.getSession().setAttribute(name, value);
            }
            else{
           
            InputStream is=stream;
            //BufferedReader r=new BufferedReader(new InputStreamReader(is,"gbk"));

             //获得链接传过来的参数
            String employeeid = req.getParameter("employeeid").toString();//cmd.getEmployee().getEmployeeid();
            Resumefile resumefile = new Resumefile();
            Employeebank employeebank = employeeService
                    .selectEmployeeById(employeeid);
            resumefile.setEmployeebank(employeebank);
            resumefile.setEmployeeid(employeeid);
            resumefile.setFilesuffix(item.getName());
            resumefile.setFilestore(Hibernate.createBlob(is));//将输入流转换为大对象
            employeeService.saveResumefile(resumefile);
            is.close();
            stream.close();

 

前台:

           
 <form action="" id="addForm" enctype="MULTIPART/FORM-DATA" method="post">
            <div style="text-align:left;PADDING-LEFT: 15px">
             。。。
            <table>
            <tr>
            <td><input type="file" id="normal" name="inputFile" /></td>
           
            </tr>
             。。。
        </table>
        </form>


其他不重要的省略   

下载:

control:

             Resumefile resumefile = new Resumefile();
            resumefile.setEmployeeid(employeeid);
            resumefile = employeeService.getResumefile(employeeid);
           
            res.setHeader("Pragma","No-cache");
            res.setHeader("Cache-Control","no-cache");
            res.setDateHeader("Expires", 0);
            res.setContentType("application/x-msdownload");
//这句最重要,自动弹出要下载的路径
            //res.setContentType("application/OCTET-STREAM;charset=UTF-8");

            res.setHeader("Content-Disposition", "attachment;filename="+java.net.URLEncoder.encode(resumefile.getFilesuffix(),"utf-8") );//解决弹出框乱码的问题
           
            Blob blob = resumefile.getFilestore();//获得大字段
            InputStream is = blob.getBinaryStream();
            OutputStream outs=new BufferedOutputStream(res.getOutputStream());

           
           
           
            int b;
            byte[] buffer = new byte[1024*1024];   //这里可以更灵活点
            while((b = is.read(buffer)) != -1){
                outs.write(buffer);
            }
            is.close();
            outs.flush();
            outs.close();
            res.flushBuffer();
//记得要关闭流,否则有可能报错,respons输出流已被调用,注意:该方法没有返回值!!

 

前台:给个链接就行

先记下来,怕忘了,原理还没弄懂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值