jsp+servlet實現上傳圖片到伺服器並返回下載該圖片的二維碼
阿新 • • 發佈:2019-01-24
下面這個是利用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("生成二維碼圖片失敗"); } } }