java代码post图片(二进制文件)到服务器,servlet接收

JavaWeb基础 专栏收录该内容
11 篇文章 0 订阅


前言:

        本文重点介绍客户端用java代码怎么写,以及服务器端servlet代码怎么写,置于如何配置请参考另一篇博文:

链接:java代码post表单数据到服务器,servlet接收处理


概述:

        post图片其实就是post二进制文件,不同于post表单数据。表单数据以键值对(Key-Value)的形式,客户端放在Map集合当中,利用PrintWriter,打印输出到服务器上,然后服务器端,使用request的getParameter()来获取对应值。

        而二进制文件其实也是好post的,思想就是,在客户端,先从磁盘上读取到要传送的文件,本文就以图片为例了,然后获取一个输出流:

URL url = new URL(“http://localhost:8080/test1/Upload_image”);

URLConnection connection = url.openConnection();

BufferedOutputStream bos = new BufferedOutputStream(connection.getOutputStream())

然后利用BufferedOutputStream 的方法,写入数据到流里面给服务器端就行。

然后服务器端是利用的tomcat提供的jar包,其中常用包javax.servlet 下面三张图摘自《java8编程参考官方教程》第9版




        从中我们可以看出有一个ServletInputStream这个类,查API文档javaEE  api文档下载:点击下载java_ee_api

可以知道这个类能得到一个来自客户端的流,它往往使用HttpServletRequest     request;      request.getInputStream()这个方法来得到,然后从ServletInputStream这个类有一个方法:


所以我们可以利用这个方法来读取客户端传上来的流数据,然后再原封不动写出去就ok了,下面上代码:


1、客户端

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;

public class PostImage {

	public static void main(String[] args) throws IOException {
		//这个地方根据自己的实际情况做更改,比如你自己的IP地址,以及你在tomcat中的工程部署
		//这里的地址要和web.xml当中的设置匹配
		String url = "http://localhost:8080/test1/Upload_image";
		
		String result = doPost(url);
		System.out.println(result);
		
	}
		
	public static String doPost(String urlString)
			throws IOException {
		URL url = new URL(urlString);
		URLConnection connection = url.openConnection();
		connection.setDoOutput(true);

		//try里面拿到输出流,输出端就是服务器端
		try (BufferedOutputStream bos = new BufferedOutputStream(connection.getOutputStream())) {
			
			//我java代码是在Windows上运行的,图片路径就是下面这个			
			InputStream is = new FileInputStream("d:/0213.JPG");
			BufferedInputStream bis = new BufferedInputStream(is);
			
			byte[] buf= new byte[1024];
			int length = 0;
			length = bis.read(buf);
			while(length!=-1) {
				bos.write(buf, 0, length);
				length = bis.read(buf);
			}
			bis.close();
			is.close();
			bos.close();
		}
	
		//下面是服务器端如果有返回数据的话,做接收用的
		StringBuilder response = new StringBuilder();
		try (Scanner in = new Scanner(connection.getInputStream())) {
			while (in.hasNextLine()) {
				response.append(in.nextLine());
				response.append("\n");
			}
		} catch (IOException e) {
			if (!(connection instanceof HttpURLConnection))
				throw e;
			InputStream err = ((HttpURLConnection) connection).getErrorStream();
			if (err == null)
				throw e;
			Scanner in = new Scanner(err);
			response.append(in.nextLine());
			response.append("\n");
			in.close();
		}

		return response.toString();
	}

}

2、服务器端

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Upload_image extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		response.setContentType("text/html");
		

		PrintWriter pw = response.getWriter();
		
		//回复给客户端一个信息	
		pw.println("receive!");
		//利用request对象返回客户端来的输入流
		try (ServletInputStream sis = request.getInputStream()) {
			
			OutputStream os = new FileOutputStream("d:/sevlet.jpg");
			BufferedOutputStream bos = new BufferedOutputStream(os);
			
			byte[] buf= new byte[1024];
			int length = 0;
			length = sis.readLine(buf, 0, buf.length);//使用sis的读取数据的方法
			while(length!=-1) {
				bos.write(buf, 0, length);
				length = sis.read(buf);
			}
			sis.close();
			bos.close();
			os.close();
		}
		
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		//转到doGet中做处理
		doGet(request, response);
	}

}

最后在web.xml中配置好即可:

<servlet>
  	<servlet-name>Upload_image</servlet-name>
  	<servlet-class>Upload_image</servlet-class>
  </servlet>
  <servlet-mapping>
 	<servlet-name>Upload_image</servlet-name> 
  	<url-pattern>/Upload_image</url-pattern>
  </servlet-mapping>

总结:

        上传图片归根结底其实就是使用了IO流的概念,把二进制数据当成流来读写,即能达到传输的目的。之前查到网上有一些现有的框架、或者是Apache提供的包,捣鼓半天没弄出来,还是英语水平太差了,因为那些包并不常用,所以只有官网上的api文档,很多方法不知道怎么用,后来自己捣鼓出这种直接以流的方式来传输,感觉也还是可以。

  • 1
    点赞
  • 4
    评论
  • 10
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值