先读取网络图片,再上传到目标服务器,支持自定义header。


/**
 * 网络图片上传到微信服务器
 * @param url 服务器地址
 * @param formName 文件域表单名称
 * @param filePath (远程)文件地址
 * @param header 自定义头信息
 * @return 上传的结果
 */
public static String uploadImage(String url, String formName, String filePath, Map<String, String> header) throws Exception {
    String result = null;
    String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
    // 获取网络图片
    URL mediaUrl = new URL(filePath);
    HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl.openConnection();
    meidaConn.setDoOutput(true);
    meidaConn.setRequestMethod("GET");

    /**
     * 第一部分
     */
    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");

    header = header == null ? Collections.EMPTY_MAP : header;
    for(Map.Entry<String, String> entry : header.entrySet()){
        con.setRequestProperty(entry.getKey(), entry.getValue());
    }
    // 设置边界
    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=\"" + formName + "\";filename=\"" + fileName + "\"\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(meidaConn.getInputStream());
    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();
    meidaConn.disconnect();
    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) {
            buffer.append(line);
        }
        if (result == null) {
            result = buffer.toString();
        }
    } catch (IOException e) {
        e.printStackTrace();
        throw new IOException("数据读取异常");
    } finally {
        if (reader != null) {
            reader.close();
        }
    }
    return result;
}