1. 程式人生 > >jsp+servlet實現上傳圖片到伺服器並返回下載該圖片的二維碼

jsp+servlet實現上傳圖片到伺服器並返回下載該圖片的二維碼

下面這個是利用java實現將一張圖片上傳到伺服器上並且返回下載該圖片的二維碼

其中用到的生成二維碼的外掛是zxing

廢話不多說直接上程式碼

package com.gzar.servlet;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.gzar.util.EncoderHandler;

public class GetQrCodeServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request, response);

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("image/jpeg");
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");

		String uploadPath = "D:" + File.separator + "Kinect";// 上傳的地址
		String content = "http://....:8080/kinect/"; // 二維碼的內容(在這裡就是圖片的下載地址)這裡需要填寫下載圖片的地址 kinect是我在tomcat中配置的虛擬地址。
		ServletOutputStream out = response.getOutputStream();

		boolean isMulti = ServletFileUpload.isMultipartContent(request);
		if (isMulti) {
			FileItemFactory fif = new DiskFileItemFactory();
			ServletFileUpload upload = new ServletFileUpload(fif);

			try {
				List<FileItem> items = upload.parseRequest(request);
				for (FileItem item : items) {
					if (!item.isFormField()) {
						String fileName = item.getName();
						// InputStream in = item.getInputStream();
						// fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
						System.out.println("fileName=" + fileName);
						uploadPath = uploadPath + File.separator + fileName;
						content = content + fileName;

						File storeFile = new File(uploadPath);

						item.write(storeFile);

						// 生成二維碼
						System.out.println(content);
						EncoderHandler encoder = new EncoderHandler();

						encoder.zxingCodeCreate(content, 600, 600, "jpg", out);

					}
				}

			} catch (FileUploadException e) {
				// TODO Auto-generated catch block
				out.print("圖片上傳失敗");
				e.printStackTrace();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				out.print("未知錯誤");
				e.printStackTrace();
			} finally {
				out.flush();
				out.close();
			}

		}

	}

}

下面是生成二維碼的程式碼,這個比較粗糙,假如你想設定更多的引數需要去別的部落格看看。

這裡我是將生成的二維碼的輸出流放入ServletOutputStream out = response.getOutputStream();也就是response的輸出流中,這樣作為一個響應,直接返回給客戶端。

package com.gzar.util;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;

public class EncoderHandler {
	 //二維碼顏色
    private static final int BLACK = 0xFF000000;
    //二維碼顏色
    private static final int WHITE = 0xFFFFFFFF;
	 public void zxingCodeCreate(String text, int width, int height,String imageType,ServletOutputStream out){
		 
		
	        Map<EncodeHintType, String> his = new HashMap<EncodeHintType, String>();
	        //設定編碼字符集
	        his.put(EncodeHintType.CHARACTER_SET, "utf-8");
	        try {
	        	//解決中文亂碼的問題
	        	text=new String(text.getBytes("UTF-8"),"ISO-8859-1");//如果不想更改原始碼,則將字串轉換成ISO-8859-1編碼
	            //1、生成二維碼
	            BitMatrix encode = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height);
	            
	            //2、獲取二維碼寬高
	            int codeWidth = encode.getWidth();
	            int codeHeight = encode.getHeight();
	            
	            //3、將二維碼放入緩衝流
	            BufferedImage image = new BufferedImage(codeWidth, codeHeight, BufferedImage.TYPE_INT_RGB);
	            for (int i = 0; i < codeWidth; i++) {
	                for (int j = 0; j < codeHeight; j++) {
	                    //4、迴圈將二維碼內容定入圖片
	                    image.setRGB(i, j, encode.get(i, j)?BLACK:WHITE);
	                }
	            }
	            
	            
	            image.flush();
	            //5、將二維碼寫入圖片
	            ImageIO.write(image, imageType,out);
	            
	            System.out.println("二維碼生成成功");
	        } catch (WriterException e) {
	            e.printStackTrace();
	            System.out.println("二維碼生成失敗");
	        } catch (IOException e) {
	            e.printStackTrace();
	            System.out.println("生成二維碼圖片失敗");
	        }
	    }


}