作微信開發中的羣發圖文消息接口,可是上傳圖片須要用到模擬curl的上傳方式,因而有了下面的代碼 。java
1.上傳圖片spring
我用的是wangeditor控件上傳的圖片http://www.wangeditor.com/json
前臺怎麼傳遞的這裏很少描述,下面是後臺接收的方法(springmvc)緩存
/** * uploadFile:ueditor上傳附件. <br/> * * @author lcma * @param model * Model * @param file * MultipartFile * @param request * HttpServletRequest * @param response * HttpServletResponse * @return * @throws Exception */ @RequestMapping(value = "uploadImg") @ResponseBody public WangeditorUploadImg uploadFile(@RequestParam(value = "upfile", required = false) MultipartFile upfile, HttpServletRequest request, HttpServletResponse response) throws Exception { String accessToken = TokenUtil.getToken(APPID, APPSECRET);// 獲取accesstoken // 在這裏進行一次強轉,把MultipartFile轉File CommonsMultipartFile cf = (CommonsMultipartFile) upfile; DiskFileItem fi = (DiskFileItem) cf.getFileItem(); File file = fi.getStoreLocation(); // 修改圖片格式 String c = file.getParent(); String fileName = file.getName(); System.out.println(fileName); fileName = fileName.split("\\.")[0]; File mm = new File(c + File.pathSeparator + fileName + ".jpg"); String url = null; if (file.renameTo(mm)) {//若是修改格式成功,則調用上傳圖片到微信服務器的靜態方法 url =MessageUtil.uploadImgInNews(mm, accessToken);//獲取微信返回的url } if (url != null) {//封裝成對象返回給前臺頁面 String[] data = new String[] { url }; WangeditorUploadImg wangeditorUploadImg = new WangeditorUploadImg(); wangeditorUploadImg.setErrno(0); wangeditorUploadImg.setData(data); return wangeditorUploadImg; }else{ return null; } }
而後是模擬curl上傳圖片到微信服務器的靜態方法,這裏只作了臨時文件的上傳服務器
/** * 模擬form表單的形式 ,上傳文件 以輸出流的形式把文件寫入到url中,而後用輸入流來獲取url的響應 * * @param url * 請求地址 form表單url地址 * @param filePath * 文件在服務器保存路徑 * @return String url的響應信息返回值 * @throws IOException */ public static String uploadImgInNews(File file,String accessToken) throws Exception{ String url = Contants.WECHAT_UPLOADIMG_NEWS;//微信上傳圖片的url url = url.replaceAll("ACCESS_TOKEN", accessToken); String result = null; if (!file.exists() || !file.isFile()) { throw new IOException("文件不存在"); } // 第一部分 URL urlObj = new URL(url); HttpURLConnection con = (HttpURLConnection) urlObj.openConnection(); // 設置關鍵值 con.setRequestMethod("POST"); // 以Post方式提交表單,默認get方式 con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false); // post方式不能使用緩存 // 設置請求頭信息 con.setRequestProperty("Connection", "Keep-Alive"); con.setRequestProperty("Charset", "UTF-8"); // 設置邊界 String BOUNDARY = "----------" + System.currentTimeMillis(); con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); // 請求正文信息 // 第一部分: StringBuilder sb = new StringBuilder(); sb.append("--"); // 必須多兩道線 sb.append(BOUNDARY); sb.append("\r\n"); sb.append("Content-Disposition: form-data;name=\"file\";filename=\"" + file.getName() + "\"\r\n"); sb.append("Content-Type:application/octet-stream\r\n\r\n"); byte[] head = sb.toString().getBytes("utf-8"); // 得到輸出流 OutputStream out = new DataOutputStream(con.getOutputStream()); // 輸出表頭 out.write(head); // 文件正文部分 // 把文件已流文件的方式 推入到url中 DataInputStream in = new DataInputStream(new FileInputStream(file)); int bytes = 0; byte[] bufferOut = new byte[1024]; while ((bytes = in.read(bufferOut)) != -1) { out.write(bufferOut, 0, bytes); } in.close(); // 結尾部分 byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定義最後數據分隔線 out.write(foot); out.flush(); out.close(); StringBuffer buffer = new StringBuffer(); BufferedReader reader = null; try { // 定義BufferedReader輸入流來讀取URL的響應 reader = new BufferedReader(new InputStreamReader(con.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { // System.out.println(line); buffer.append(line); } if (result == null) { result = buffer.toString(); } } catch (IOException e) { System.out.println("發送POST請求出現異常!" + e); e.printStackTrace(); throw new IOException("數據讀取異常"); } finally { if (reader != null) { reader.close(); } } JSONObject jsonObject = JSONObject.parseObject(result); String imgurl = jsonObject.getString("url"); return imgurl; }
這兩步完成以後就能成功上傳圖片並獲得微信返回的url而且回顯在頁面上,可是有一個問題,就是坑爹的微信不容許其餘人隨意引用他服務器上的資源,因此圖片回顯的效果是這樣的微信
個人解決方法就是傳給微信的同時,往本身服務器也傳一份,而後回顯給頁面的url用的是本身服務器的路徑微信開發