JavaWeb 【基础】 java客户端http上传图片到服务端 (写入文件流)

目录

    • 本地客户端代码:
      • 获取图片base64编码
      • 使用httpclient 执行post
    • 服务端代码:

记录一下java 本地代码 通过 httpclient 传递 图片 base64 编码 到服务器,然后服务器 储存图片 的一个小demo。

本地客户端代码:

获取图片base64编码

	// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
    public static String getImageBase64(String imgFilePath) {
        byte[] data = null;

        // 读取图片字节数组
        try {
            InputStream in = new FileInputStream(imgFilePath);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);// 返回Base64编码过的字节数组字符串
    }

使用httpclient 执行post

maven中引入httpclient包

        <dependency>
            <groupId>org.apache.httpcomponentsgroupId>
            <artifactId>httpclientartifactId>
            <version>4.5.2version>
        dependency>
        <dependency>
            <groupId>org.apache.httpcomponentsgroupId>
            <artifactId>httpcoreartifactId>
            <version>4.4.6version>
        dependency>

    public static void HttpClientPost(String url,List<NameValuePair> list) throws Exception {
        // 获取默认的请求客户端
        CloseableHttpClient client = HttpClients.createDefault();
        // 通过HttpPost来发送post请求
        HttpPost httpPost = new HttpPost(url);

        // 我们发现Entity是一个接口,所以只能找实现类,发现实现类又需要一个集合,集合的泛型是NameValuePair类型
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(list);
        // 通过setEntity 将我们的entity对象传递过去
        httpPost.setEntity(formEntity);

        // 通过client来执行请求,
        CloseableHttpResponse response = client.execute(httpPost);
        //下面是获取响应
//        HttpEntity entity = response.getEntity();
//        String str = EntityUtils.toString(entity, "UTF-8");
//        System.out.println(str);

        response.close();
    }

最后。定义方法,调用httpost 。然后指定3个参数,1个访问地址

  • type 访问类型
  • filename 自定义文件名
  • base64str 编码
  • http://localhost/api 访问地址
    public static void  send(){
        System.out.println("发送图片请求");

        // post带参数
        List<NameValuePair> list = new ArrayList<NameValuePair>();
        BasicNameValuePair b = new BasicNameValuePair("type", "uploadimg");
        BasicNameValuePair b2 = new BasicNameValuePair("filename", "kl.jpg");
        BasicNameValuePair b3 = new BasicNameValuePair("base64str", getImageBase64("C:\\Users\\ASUS\\Desktop\\kl.jpg"));
        list.add(b);
        list.add(b2);
        list.add(b3);
        try {
            HttpClientPost("http://localhost/api",list);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

服务端代码:

获取requst 中的参数,然后保存图片

JavaWeb 【基础】 java客户端http上传图片到服务端 (写入文件流)_第1张图片

@WebServlet(name = "api" ,urlPatterns="/api")
public class apitest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String type = request.getParameter("type");
        if(type!=null &&type.equals("uploadimg")) {
            String filename =  request.getParameter("filename");
            String base64str =  request.getParameter("base64str");
            saveImg("D://img/"+filename,base64str);
        }
    }

    public void saveImg(String url,String base64_Str){
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            // Base64解码
            byte[] bytes = decoder.decodeBuffer(base64_Str);
            for (int i = 0; i < bytes.length; ++i) {
                if (bytes[i] < 0) {// 调整异常数据
                    bytes[i] += 256;
                }
            }
            // 生成图片
            OutputStream outs = new FileOutputStream(url);
            outs.write(bytes);
            outs.flush();
            outs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


接下来我们在本地使用tomcat测试一下。
重写servelet init方法。开启定时器,检测D://img/kl.jpg文件如果存在,则服务器发送文件到 D://img/kl(send).jpg
JavaWeb 【基础】 java客户端http上传图片到服务端 (写入文件流)_第2张图片

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    File file = new File("D://img/kl.jpg");
                    if(file.exists()){
                        FileUtil.send("kl(send).jpg");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        },5*1000,5*1000);

ok,开启tomcat ,然后访问 /api ,接着severlet 执行init方法,开启定时器

JavaWeb 【基础】 java客户端http上传图片到服务端 (写入文件流)_第3张图片
。。。5秒过后,大功告成。
JavaWeb 【基础】 java客户端http上传图片到服务端 (写入文件流)_第4张图片

你可能感兴趣的:(JavaWeb,【基础】,java,javaweb,图片上传服务器,post,http)