作微信开发中的群发图文消息接口,可是上传图片须要用到模拟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用的是本身服务器的路径微信开发