servlet接收web上传文件

        今天用公司自己封装的框架开发时,突然需要向服务器上传文件,通过查找资料,发现两种方式可以相对方便的接收文件。

        方法一:request.getPart("web端的文件标签名");

                getPart()是servlet3.0新增的方法,而且需要tomcat7.0以上的版本,web.xml的version在3.0以上,使用getPart()需要注意的是要对servlet使用@MultipartConfig()注解,否则得到结果是空的。

        File filePath = new File(realPath);
        if(!filePath.exists())
            filePath.mkdirs();
        Part part = req.getPart("upload");
        InputStream in = part.getInputStream();
        OutputStream out = new FileOutputStream(realPath + fileName);
        byte[] buffer = new byte[1024];
        int length = -1;
        while ((length = in.read(buffer)) != -1) {
            out.write(buffer, 0, length);
        }
        in.close();
        out.close();

        方法二:先读取输入流,在取文件在流的位置,在写入文件

                读取输入流

    /**
     * 读取流
     * @param request
     * @return
     * @throws IOException
     */
    private byte[] readBody(HttpServletRequest request) throws IOException {
        //获取请求文本字节长度
        int formDataLength = request.getContentLength();
        //取得ServletInputStream输入流对象
        DataInputStream dataStream = new DataInputStream(request.getInputStream());
        byte body[] = new byte[formDataLength];
        int totalBytes = 0;
        while (totalBytes < formDataLength) {
            int bytes = dataStream.read(body, totalBytes, formDataLength);
            totalBytes += bytes;
        }
        
        return body;
    }

                获取文件内容在流数据的位置

    /**
     * 流中文件的位置
     * @author lenovo
     *
     */
    class Position {
        int begin;
        int end;
 
        public Position(int begin, int end) {
            this.begin = begin;
            this.end = end;
        }
    }
    
    /**
     * 获取文件流的位置
     * @param request
     * @param textBody
     * @return
     * @throws IOException
     */
    private Position getFilePosition(HttpServletRequest request, String textBody) throws IOException {
        //取得文件区段边界信息
        String contentType = request.getContentType();
        String boundaryText = contentType.substring(contentType.lastIndexOf("=") + 1, contentType.length());
        //取得实际上传文件的气势与结束位置
        int pos = textBody.indexOf("filename=\"");
        pos = textBody.indexOf("\n", pos) + 1;
        pos = textBody.indexOf("\n", pos) + 1;
        pos = textBody.indexOf("\n", pos) + 1;
        int boundaryLoc = textBody.indexOf(boundaryText, pos) - 4;
        int begin = ((textBody.substring(0, pos)).getBytes("ISO-8859-1")).length;
        int end = ((textBody.substring(0, boundaryLoc)).getBytes("ISO-8859-1")).length;
 
        return new Position(begin, end);
    }

                写入文件

    /**
     * 流写入文件
     * @param fileName
     * @param body
     * @param p
     * @throws IOException
     */
    private void writeTo(String fileName, byte[] body, Position p) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(fileName);
        fileOutputStream.write(body, p.begin, (p.end - p.begin));
        fileOutputStream.flush();
        fileOutputStream.close();
    }

        以上就是所有的核心代码,之后可以继续深入研究,重新封装。





转载于:https://my.oschina.net/u/1792792/blog/629821

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值