精华内容
下载资源
问答
  • java直接下载网络URL图片给用户浏览器 通过请求网络URL图片直接返回给用户 浏览器直接下载 FileDownloadController package top.wintp.demo.demo.controller; import org.springframework.http.HttpHeaders; ...

    java直接下载网络URL图片给用户浏览器

    通过请求网络URL图片直接返回给用户 浏览器直接下载

    FileDownloadController

    package top.wintp.demo.demo.controller;
    
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * 推流给用户
     *
     * @author: pyfysf
     * <p>
     * @qq: 337081267
     * <p>
     * @CSDN: http://blog.csdn.net/pyfysf
     * <p>
     * @blog: http://wintp.top
     * <p>
     * @email: pyfysf@163.com
     * <p>
     * @time: 2019/12/6
     */
    @Controller
    public class FileDownloadController {
    
        /**
         * 下载文件
         *
         * @return
         */
        @RequestMapping("/downloadFileByIs")
        public ResponseEntity<byte[]> downloadFile() throws IOException {
            String targetUrl = "http://img.wintp.top/zblog/meinv.png";
            HttpStatus status = HttpStatus.CREATED;
    
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", System.currentTimeMillis() + ".png");
    
            InputStream is = HttpUtils.dowloadFile(targetUrl);
    
            byte[] bytes = readInputStream(is);
    
            return new ResponseEntity<byte[]>(bytes, headers, status);
    
        }
    
    
        /**
         * 读取字节输入流内容
         *
         * @param is
         * @return
         */
        private byte[] readInputStream(InputStream is) {
            ByteArrayOutputStream writer = new ByteArrayOutputStream();
            byte[] buff = new byte[1024 * 2];
            int len = 0;
            try {
                while ((len = is.read(buff)) != -1) {
                    writer.write(buff, 0, len);
                }
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return writer.toByteArray();
        }
    
    
    }
    
    

    HttpUtils

    package top.wintp.demo.demo.controller;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    
    public class HttpUtils {
        /**
         * 模拟 http post请求
         *
         * @param httpUrl
         * @return
         * @throws IOException
         */
        public static InputStream dowloadFile(String httpUrl) throws IOException {
            URL url = null;
            try {
                url = new URL(httpUrl);
            } catch (MalformedURLException e1) {
                e1.printStackTrace();
            }
    
            URLConnection conn = url.openConnection();
            InputStream inStream = conn.getInputStream();
            return inStream;
        }
    
    
    }
    
    

    上述代码运行在SpringBoot的环境中

    展开全文
  • 我在地图上生成了一个线路图,从上海到北京的,十点的时候我返回了一个地址服务端,十二点的时候我又返回了一个地址。。。。。依次类推、、、、、请问下这个地址怎么获得呢?用的是百度地图的API.我可以在网页上面...
  • setTitle("图片浏览器"); setLocation(300, 100); setSize(1300, 900); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); setLayout(new BorderLayout()); //图片列表 ...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
  • 其实这两个截图就可以看出,我们图片上传成功了,并且小程序前端返回了可供访问的图片url。 话不多说,直接看代码。 一,小程序端代码 1,wxml布局文件 其实页面很简答,一个上传按钮,一个选择图片按钮。一定要...

    最近在做小程序多图片上传到Java后台,Java后台是用springboot写的。也算是踩了不少坑,今天就来带大家来一步步实现小程序端多图片的上传。

    首先看效果实现图

    小程序端上传成功的回调

    Java端接受到图片后的打印

    链接可以直接在浏览器里打开查看

    其实这两个截图就可以看出,我们图片上传成功了,并且给小程序前端返回了可供访问的图片url。
    话不多说,直接看代码。

    一,小程序端代码

    1,wxml布局文件

    其实页面很简答,一个上传按钮,一个选择图片按钮。一定要记得先选择图片,然后再点击图片上传。
    2,js文件
    再来看下js文件,js文件里最重要的就是uploadFile方法

    uploadFile方法里我们请求自己的Java后台接口,进行图片上传。这里有些注意点要给大家说下

    • 小程序每次只能上传单张图片
    • 如果采用for循环进行上传请求 会出现并行上传,并行上传会出现某一个图片漏传的问题
    • 我采用串行的思路,每张图片执行一次上传请求,请求响应成功后在调用请求上传第二张图片,以此类推 。
      下面把完整的代码贴出来给到大家
    Page({
      data: {
        img_arr: [],
        formdata: '',
      },
      //点击发布按钮
      formSubmit() {
        this.uploadFile(0)
      },
      //上传图片
      uploadFile: function (index) {
        var that = this
        //如果所有图片都已经上传完,就不再往下执行
        if (index >= that.data.img_arr.length) {
          return
        }
        wx.uploadFile({
          url: 'http://localhost:8080/upload/picture', //自己的Java后台接口地址
          filePath: that.data.img_arr[index],
          name: 'content',
          header: {
            "Content-Type": "multipart/form-data",
            'accept': 'application/json',
            'Authorization': 'okgoodit' //若有token,此处换上你的token,没有的话省略
          },
          formData: ({ //上传图片所要携带的参数
            username: "编程小石头",
            password: '2501902696'
          }),
          success: function (res) {
            console.log(`第${index+1}张上传成功`, res)
            index++
            that.uploadFile(index)
          },
          fail(res) {
            console.log(`第${index+1}张上传失败`, res)
          }
        })
      },
      //选择要上传的图片
      upimg: function () {
        var that = this;
        //这里小程序规定最好只能选9张,我这里随便填的3,你也可以自己改
        if (this.data.img_arr.length < 3) {
          wx.chooseImage({
            sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
            sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
            success: function (res) {
              that.setData({
                img_arr: that.data.img_arr.concat(res.tempFilePaths)
              });
            }
          })
        } else {
          wx.showToast({
            title: '最多上传三张图片',
            icon: 'loading',
            duration: 3000
          });
        }
      },
    })
    

    代码里注释很清楚了。到这里小程序端基本上完事了。接下来我们看Java后台的实现。

    二,Java后台代码

    先来看后台代码目录,后台代码很简单,就是一个UploadController

    这里的主要实现方法都在uploadPicture

    @RequestMapping("/picture")
        public String uploadPicture(HttpServletRequest request, HttpServletResponse response) throws Exception {
            String filePath = "";
            request.setCharacterEncoding("utf-8"); //设置编码
            String realPath = request.getSession().getServletContext().getRealPath("/uploadFile/");
            File dir = new File(realPath);
            //文件目录不存在,就创建一个
            if (!dir.isDirectory()) {
                dir.mkdirs();
            }
            try {
                StandardMultipartHttpServletRequest req = (StandardMultipartHttpServletRequest) request;
                //获取formdata的值
                Iterator<String> iterator = req.getFileNames();
                String username = request.getParameter("username");
                String password = request.getParameter("password");
                String timedata = request.getParameter("timedata");
    
                while (iterator.hasNext()) {
                    MultipartFile file = req.getFile(iterator.next());
                    String fileName = file.getOriginalFilename();
                    //真正写到磁盘上
                    String uuid = UUID.randomUUID().toString().replace("-", "");
                    String kzm = fileName.substring(fileName.lastIndexOf("."));
                    String filename = uuid + kzm;
                    File file1 = new File(realPath + filename);
                    OutputStream out = new FileOutputStream(file1);
                    out.write(file.getBytes());
                    out.close();
                    filePath = request.getScheme() + "://" +
                            request.getServerName() + ":"
                            + request.getServerPort()
                            + "/uploadFile/" + filename;
                    System.out.println("访问图片路径:" + filePath + "====username:" + username);
                }
            } catch (Exception e) {
                logger.error("", e);
            }
            return filePath;
    
        }
    

    这里我给大家讲下实现步骤

    • 1,springboot对外提供接口供小程序访问
    • 2,小程序上传单个图片和额外参数给后台
    • 3,后台把图片写到本地,或者图片服务器,然后返回对应的图片url给到小程序端。

      通过上图可以看出,Java后台返回了对应的图片url给前端,并且可以拿到小程序前端传的用户名。
      我这里把完整的代码贴给大家。
    package com.img.demo;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.Iterator;
    import java.util.UUID;
    
    /**
     * 图片上传
     * 编程小石头
     */
    @RestController
    @RequestMapping("/upload")
    public class UploadController {
        private static final Logger logger = LoggerFactory.getLogger(UploadController.class);
    
        @RequestMapping("/picture")
        public String uploadPicture(HttpServletRequest request, HttpServletResponse response) throws Exception {
            String filePath = "";
            request.setCharacterEncoding("utf-8"); //设置编码
            String realPath = request.getSession().getServletContext().getRealPath("/uploadFile/");
            File dir = new File(realPath);
            //文件目录不存在,就创建一个
            if (!dir.isDirectory()) {
                dir.mkdirs();
            }
            try {
                StandardMultipartHttpServletRequest req = (StandardMultipartHttpServletRequest) request;
                //获取formdata的值
                Iterator<String> iterator = req.getFileNames();
                String username = request.getParameter("username");
                String password = request.getParameter("password");
                String timedata = request.getParameter("timedata");
    
                while (iterator.hasNext()) {
                    MultipartFile file = req.getFile(iterator.next());
                    String fileName = file.getOriginalFilename();
                    //真正写到磁盘上
                    String uuid = UUID.randomUUID().toString().replace("-", "");
                    String kzm = fileName.substring(fileName.lastIndexOf("."));
                    String filename = uuid + kzm;
                    File file1 = new File(realPath + filename);
                    OutputStream out = new FileOutputStream(file1);
                    out.write(file.getBytes());
                    out.close();
                    filePath = request.getScheme() + "://" +
                            request.getServerName() + ":"
                            + request.getServerPort()
                            + "/uploadFile/" + filename;
                    System.out.println("访问图片路径:" + filePath + "====username:" + username);
                }
            } catch (Exception e) {
                logger.error("", e);
            }
            return filePath;
        }
    }
    

    至于如何创建springboot项目这么基础的知识,我这里就不再给大家讲解了。

    到这里,我们的小程序多图片上传就算大工告成了,后面我会录制相关的视频出来,感兴趣的同学可以关注“编程小石头”公众号,回复“多图片上传”,即可获取源码。

    展开全文
  • 登录验证码demo-java

    2017-12-18 16:55:00
    在一些类似于管理系统的项目中,我们在登录时经常会用到图片验证码。这里把我自己写的一个小系统(后台是java语言)的验证码部分摘出来。...我这里是把后端生成的验证码生成图片返回给浏览器时,同时...

    在一些类似于管理系统的项目中,我们在登录时经常会用到图片验证码。这里把我自己写的一个小系统(后台是java语言)的验证码部分摘出来。

    总体思路是后端有一个生成验证码图片的接口,把验证码图片写入浏览器,前端页面在img标签里的src属性里填写后端生成验证码图片的接口地址即可。

    1、java部分-CaptchaController.java

    我这里是把后端生成的验证码生成图片返回给浏览器时,同时存入到了数据库中,前端登录时,后端根据前端输入的验证码和数据库中的验证码作对比,来判断是否可以登录。

    package com.lin.controller;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.lin.domain.Captcha;
    import com.lin.service.SysUserService;
    
    
    /**
     * 验证码-controller
     * @author libo
     */
    @Controller
    @RequestMapping("/captcha")
    public class CaptchaController {
        
        @Autowired
        private SysUserService uService;
        
        /**
         * 随机字符字典
         */
        private static final char[] CHARS = { '2', '3', '4', '5', '6', '7', '8',
            '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M',
            'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm',
            'n', 'p', 'q', 'r', 's', 't', 'u' ,'v', 'w', 'x', 'y', 'z'};
        
        /**
         * 随机数
         */
        private static Random random = new Random();
        
        /**
         * 获取4位随机数
         * @return
         */
        private static String getRandomString() {
            StringBuffer buffer = new StringBuffer();
            for(int i = 0; i < 4; i++) {
                buffer.append(CHARS[random.nextInt(CHARS.length)]);
            }
            return buffer.toString();
        }
        
        /**
         * 获取随机数颜色
         * @return
         */
        private static Color getRandomColor() {
            return new Color(random.nextInt(255),random.nextInt(255), random.nextInt(255));
        }
        
        /**
         * 返回某颜色的反色
         * @param c
         * @return
         */
        private static Color getReverseColor(Color c) {
            return new Color(255 - c.getRed(), 255 - c.getGreen(), 255 - c.getBlue());
        }
        
        /**
         * 生成验证码
         * @param request
         * @param response
         * @throws ServletException
         * @throws IOException
         */
        @ResponseBody
        @RequestMapping(value="/getCaptcha.do", method=RequestMethod.GET)
        public void outputCaptcha(HttpServletRequest request, HttpServletResponse response, String rad)
                throws ServletException, IOException {
    
            // 设置页面不缓存
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            response.setContentType("image/jpeg");
    
            String randomString = getRandomString(); //生成的验证码
            
            Captcha c = new Captcha();
            c.setCaptchaId(rad);
            c.setCaptcha(randomString.toUpperCase());
            Integer id = uService.saveCaptcha(c);//保存验证码到数据库中
            if(id > 0){    //验证码保存成功
                
            }else{    //验证码保存失败
                return;
            }
            
            int width = 100;    //验证码图像的宽度
            int height = 34;    //验证码图像的高度
    
            // 在内存中创建图象
            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bi.createGraphics();
            for(int i=0; i<randomString.length(); i++){
                Color color = getRandomColor();
                Color reverse = getReverseColor(color);
                g.setColor(color);    //设置字体颜色
                g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 25));    //设置字体样式
                g.fillRect(0, 0, width, height);
                g.setColor(reverse);
                g.drawString(randomString, 18, 25);
            }
            //随机生成一些点
            for (int i = 0, n = random.nextInt(100); i < n; i++) {
                g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
            }
            // 随机产生干扰线,使图象中的认证码不易被其它程序探测到
            for (int i = 0; i < 10; i++) {
                g.setColor(getRandomColor());
                final int x = random.nextInt(width-1); // 保证画在边框之内
                final int y = random.nextInt(height-1);
                final int xl = random.nextInt(width);
                final int yl = random.nextInt(height);
                g.drawLine(x, y, x + xl, y + yl);
            }
            g.dispose();    //图像生效
            ImageIO.write(bi, "JPEG", response.getOutputStream());    //输出图片到页面
            
        }
        
        
    }

    2、html部分-login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>后台管理系统登录</title>
        <link rel="stylesheet" href="/common/css/index.css">
        <script src="/scripts/apiConfig.js"></script>
        <script src="/lib/jquery/jquery.min.js"></script>
        <script src="/lib/aes/aes.min.js"></script>
        <script src="/common/js/utils.js"></script>
    </head>
    <body>
        <div class="layout">
            <div class="top-name">后台管理系统
                <span>Background Management System</span>
            </div>
            <div class="main">
                <div class="item">
                    <label style="word-spacing: 10px;">邮 箱:</label>
                    <input type="text" id="loginEmail" class="f-s-14" autocomplete="off" placeholder="请输入邮箱">
                    <span class="err-tip" id="tipLEmail" ng-class="m-l-15"></span>
                </div>
                <div class="item">
                    <label style="word-spacing: 10px;">密 码:</label>
                    <input type="password" id="loginPwd" class="f-s-14" autocomplete="off" placeholder="请输入密码">
                    <span class="err-tip " id="tipLPwd" ng-class="m-l-15"></span>
                </div>
                <div class="item clearfix">
                    <label>验证码:</label>
                    <input type="text" id="captcha" class="f-s-14" placeholder="请输入验证码" style="width: 200px;">
                    <a href="javascript:void(0);" onclick="updateCaptcha()" style="height: 36px;width: 100px;float: right;">
                        <img src="" alt="" id="captcha_img">
                    </a>
                    <span class="err-tip" id="tipCaptcha" ng-class="m-l-15"></span>
                </div>
                <div style="text-align: center;margin-top: -10px;height: 20px;margin-bottom: 5px;">
                    <span class="err-tip" id="error" ng-class="m-l-15" style="font-size: 14px;"></span>
                </div>
                <div class="item">
                    <button type="button" class="submit" id="submit" style="outline: none;">登 录</button>
                </div>
            </div>
        </div>
    </body>
    <script>
    
        //更新验证码
        var random = '';
        function updateCaptcha() {
            random = new Date().getTime()+''+Math.floor(Math.random() * Math.pow(10, 8));
            $('#captcha_img').attr('src', hostObj.host+'/captcha/getCaptcha.do?rad='+random);
        }
        $(function () {
            //页面加载的时候就获取验证码
            updateCaptcha();
    
            $('#loginEmail').blur(function () {
                checkLoginEmail();
            });
            $('#loginPwd').blur(function () {
                checkLoginPwd();
            });
            $('#captcha').blur(function () {
                checkCaptcha();
            });
    
            $("#submit").click(function() {
                var flag1 = checkLoginEmail();
                var flag2 = checkLoginPwd();
                var flag3 = checkCaptcha();
                if(!flag1 || !flag2 || !flag3){
                    return;
                }
                $.ajax({
                    type:'post',
                    url: hostObj.host+'/sysUser/login.do',
                    dataType:"json",
                    data:{
                        loginEmail:$("#loginEmail").val(),
                        loginPwd:encrypt($("#loginPwd").val()),
                        captcha: $('#captcha').val(),
                        captchaId: random
                    },
                    success:function(res) {
                        if(res.success == 1){
                            var user = {
                                id: res.data.id,
                                email: res.data.email,
                                createTime: res.data.createTime.substring(0,19),
                                lastLoginTime: res.data.lastLoginTime.substring(0,19),
                                status: res.data.status
                            }
                            window.location.href = "main.html";
                        }else{
                            $('#error').html(res.error.msg);
                            if(res.error.code == 4000){
                                $('#captcha').focus();
                            }
                        }
                    },
                    error:function(res){
                        $('#error').html('系统错误!');
                    }
                });
            });
    
            function checkLoginEmail() {
                if($.trim($('#loginEmail').val()) == ''){
                    $('#tipLEmail').html('请输入邮箱');
                    return false;
                }else{
                    $('#tipLEmail').html('');
                    return true;
                }
            }
    
            function checkLoginPwd() {
                if($.trim($('#loginPwd').val()) == ''){
                    $('#tipLPwd').html('请输入登录密码');
                    return false;
                }else{
                    $('#tipLPwd').html('');
                    return true;
                }
            }
    
            function checkCaptcha() {
                if($.trim($('#captcha').val()) == ''){
                    $('#tipCaptcha').html('请输入验证码');
                    return false;
                }else{
                    $('#tipCaptcha').html('');
                    return true;
                }
            }</script>
    </html>

    3、效果

     

     

    需要购买阿里云产品的,可以点击此链接购买,有红包优惠哦! https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=fp9ccf07

     

    转载于:https://www.cnblogs.com/libo0125ok/p/8058469.html

    展开全文
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
  • 一个简单的用 Java Socket 编写的 HTTP 服务器应用, 演示了请求和应答的协议通信内容以及* 客户端返回 HTML 文本和二进制数据文件(一个图片), 同时展示了 404, 200 等状态码.* 首先运行这个程序,然后打开Web浏览器,...

    import java.io.*;

    import java.net.*;

    import java.util.StringTokenizer;

    /**

    * 一个简单的用 Java Socket 编写的 HTTP 服务器应用, 演示了请求和应答的协议通信内容以及

    * 给客户端返回 HTML 文本和二进制数据文件(一个图片), 同时展示了 404, 200 等状态码.

    * 首先运行这个程序,然后打开Web浏览器,键入http://localhost,则这个程序能够显示出浏览器发送了那些信息

    * 并且向浏览器返回一个网页和一副图片, 并测试同浏览器对话.

    * 当浏览器看到 HTML 中带有图片地址时, 则会发出第二次连接来请求图片等资源.

    * 这个例子可以帮您理解 Java 的 HTTP 服务器软件是基于 J2SE 的 Socket 等软件编写的概念, 并熟悉

    * HTTP协议.

    * 相反的用 Telnet 连接到已有的服务器则可以帮忙理解浏览器的运行过程和服务器端的返回内容.

    *

    *

    * 当用户在Web浏览器地址栏中输入一个带有http://前缀的URL并按下Enter后,或者在Web页面中某个以http://开头的超链接上单击鼠标,HTTP事务处理的第一个阶段–建立连接阶段就开始了.HTTP的默认端口是80.

    * 随着连接的建立,HTTP就进入了客户向服务器发送请求的阶段.客户向服务器发送的请求是一个有特定格式的ASCII消息,其语法规则为:

    * < Method > < URL > < HTTP Version >

    * { : }*

    *

    * { Entity Body }

    * 请求消息的顶端是请求行,用于指定方法,URL和HTTP协议的版本,请求行的最后是回车换行.方法有GET,POST,HEAD,PUT,DELETE等.

    * 在请求行之后是若干个报头(Header)行.每个报头行都是由一个报头和一个取值构成的二元对,报头和取值之间以":"分隔;报头行的最后是回车换行.常见的报头有Accept(指定MIME媒体类型),Accept_Charset(响应消息的编码方式),Accept_Encoding(响应消息的字符集),User_Agent(用户的浏览器信息)等.

    * 在请求消息的报头行之后是一个回车换行,表明请求消息的报头部分结束.在这个\n之后是请求消息的消息实体(Entity Body).具体的例子参看httpRequest.txt.

    * Web服务器在收到客户请求并作出处理之后,要向客户发送应答消息.与请求消息一样,应答消息的语法规则为:

    * < HTTP Version> []

    * { : } *

    *

    * { Entity Body }

    * 应答消息的第一行为状态行,其中包括了HTTP版本号,状态码和对状态码进行简短解释的消息;状态行的最后是回车换行.状态码由3位数字组成,有5类:

    * 参看:HTTP应答码及其意义

    *

    * 1XX 保留

    * 2XX 表示成功

    * 3XX 表示URL已经被移走

    * 4XX 表示客户错误

    * 5XX 表示服务器错误

    * 例如:415,表示不支持改媒体类型;503,表示服务器不能访问.最常见的是200,表示成功.常见的报头有:Last_Modified(最后修改时间),Content_Type(消息内容的MIME类型),Content_Length(内容长度)等.

    * 在报头行之后也是一个回车换行,用以表示应答消息的报头部分的结束,以及应答消息实体的开始.

    * 下面是一个应答消息的例子:

    * HTTP/1.0 200 OK

    * Date: Moday,07-Apr-97 21:13:02 GMT

    * Server:NCSA/1.1

    * MIME_Version:1.0

    * Content_Type:text/html

    * Last_Modified:Thu Dec 5 09:28:01 1996

    * Coentent_Length:3107

    *

    *

    *

    * 在用Java语言实现HTTP服务器时,首先启动一个java.net.ServerSocket在服务器的端口上监听连接.向客户返回文本时,可以用 PrintWriter,但是如果返回二进制数据,则必须使用OutputStream.write(byte[])方法,返回的应答消息字符串可以使用 String.getBytes()方法转换为字节数组返回,或者使用PrintStream的print()方法写入文本,用 write(byte[])方法写入二进制数据.

    *

    *

    * @author 刘长炯

    * @version 1.0 2007-07-24 Sunday

    * @version 1.1 2008-05-18 Sunday

    * 支持浏览器发出的POST信息打印,修正POST方式无法完成响应造成阻赛的BUG

    */

    public class SimpleHttpServer implements Runnable {

    /**

    *

    */

    ServerSocket serverSocket;//服务器Socket

    /**

    * 服务器监听端口, 默认为 80.

    */

    public static int PORT=80;//标准HTTP端口

    /**

    * 开始服务器 Socket 线程.

    */

    public SimpleHttpServer() {

    try {

    serverSocket=new ServerSocket(PORT);

    } catch(Exception e) {

    System.out.println("无法启动HTTP服务器:"+e.getLocalizedMessage());

    }

    if(serverSocket==null) System.exit(1);//无法开始服务器

    new Thread(this).start();

    System.out.println("HTTP服务器正在运行,端口:"+PORT);

    }

    /**

    * 运行服务器主线程, 监听客户端请求并返回响应.

    */

    public void run() {

    while(true) {

    try {

    Socket client=null;//客户Socket

    int contentLength = 0;// 客户端发送的 HTTP 请求的主体的长度

    client=serverSocket.accept();//客户机(这里是 IE 等浏览器)已经连接到当前服务器

    if(client!=null) {

    System.out.println("连接到服务器的用户:"+client);

    try {

    // 第一阶段: 打开输入流

    BufferedReader in=new BufferedReader(new InputStreamReader(

    client.getInputStream()));

    System.out.println("客户端发送的请求信息:\n===================");

    // 读取第一行, 请求地址

    String line=in.readLine();

    System.out.println(line);

    String resource=line.substring(line.indexOf(‘/’),line.lastIndexOf(‘/’)-5);

    //获得请求的资源的地址

    resource=URLDecoder.decode(resource, "UTF-8");//反编码 URL 地址

    String method = new StringTokenizer(line).nextElement().toString();// 获取请求方法, GET 或者 POST

    // 读取所有浏览器发送过来的请求参数头部信息

    while( (line = in.readLine()) != null) {

    System.out.println(line);

    // 读取 POST 等数据的内容长度

    if(line.startsWith("Content-Length")) {

    try {

    contentLength = Integer.parseInt(line.substring(line.indexOf(‘:’) + 1).trim());

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    if(line.equals("")) break;

    }

    // 显示 POST 表单提交的内容, 这个内容位于请求的主体部分

    if("POST".equalsIgnoreCase(method) && contentLength > 0) {

    System.out.println("以下内容为 POST 方式提交的表单数据");

    for(int i = 0; i < contentLength; i++) {

    System.out.print((char)in.read());

    }

    System.out.println();

    }

    System.out.println("请求信息结束\n===================");

    System.out.println("用户请求的资源是:"+resource);

    System.out.println("请求的类型是: " + method);

    // GIF 图片就读取一个真实的图片数据并返回给客户端

    if(resource.endsWith(".gif")) {

    fileService("images/test.gif", client);

    closeSocket(client);

    continue;

    }

    // 请求 JPG 格式就报错 404

    if(resource.endsWith(".jpg")) {

    PrintWriter out=new PrintWriter(client.getOutputStream(),true);

    out.println("HTTP/1.0 404 Not found");//返回应答消息,并结束应答

    out.println();// 根据 HTTP 协议, 空行将结束头信息

    out.close();

    closeSocket(client);

    continue;

    } else {

    // 用 writer 对客户端 socket 输出一段 HTML 代码

    PrintWriter out=new PrintWriter(client.getOutputStream(),true);

    out.println("HTTP/1.0 200 OK");//返回应答消息,并结束应答

    out.println("Content-Type:text/html;charset=GBK");

    out.println();// 根据 HTTP 协议, 空行将结束头信息

    out.println("

    Hello Http Server

    ");

    out.println("你好, 这是一个 Java HTTP 服务器 demo 应用.
    ");

    out.println("您请求的路径是: " + resource + "
    ");

    out.println("这是一个支持虚拟路径的图片:%E2%80%99abc.gif%E2%80%99
    " +

    "点击打开abc.gif, 是个服务器虚拟路径的图片文件.");

    out.println("
    这是个会反馈 404 错误的的图片:%E2%80%99test.jpg%E2%80%99点击打开test.jpg
    ");

    out.println("

    ");
    展开全文
  • socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • Java资源包01

    2016-08-31 09:16:25
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包101

    2016-07-13 10:11:08
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户...
  • java开源包11

    热门讨论 2013-06-28 10:10:38
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
  • java开源包6

    热门讨论 2013-06-28 09:48:32
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包10

    热门讨论 2013-06-28 10:06:40
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包8

    热门讨论 2013-06-28 09:55:26
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包9

    热门讨论 2013-06-28 09:58:55
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包7

    热门讨论 2013-06-28 09:52:16
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • 一个简单的用 Java Socket 编写的 HTTP 服务器应用, 演示了请求和应答的协议通信内容以及客户端返回 HTML 文本和二进制数据文件(一个图片), 同时展示了 404, 200 等状态码.   首先运行这个程序,然后打开Web...
  • socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户...
  • Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...
  • 安卓通过浏览器访问java发布在tomcat的地址并传值:http://localhost:8080/jinyi-backgmanage/download/down?versionNumber=201708041048,java后台接受网址传过来的值进行判断,怎么把信息返回给安卓? ![图片说明]...
  • socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户...

空空如也

空空如也

1 2 3 4 5 6
收藏数 108
精华内容 43
关键字:

java返回图片给浏览器

java 订阅