java代碼post圖片(二進制文件)到服務器,servlet接收


前言:

        本文重點介紹客戶端用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文檔,很多方法不知道怎麼用,後來自己搗鼓出這種直接以流的方式來傳輸,感覺也還是可以。

發佈了44 篇原創文章 · 獲贊 36 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章