携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第二十七天,点击查看活动详情
调用微信的上传文件接口时,该接口要求必须要通过multipart/form-data的方式上传,于是研究了一下multipart/form-data。
multipart/form-data是一种post提交数据的一种方式,用来指定请求内容的数据编码格式,并且指定传输数据为二进制类型,比如图片、mp3、文件。
通过boundary来进行分割请求头与请求体,为了防止boundary与正文内容重复,boundary内容一般为一串随机的字符串。
//上传PDFurl
private final static String uploadPdfUrl = "https://api.weixin.qq.com/card/invoice/platform/setpdf";
private final static String HEAD = "Odcddwssf2exwM16BY25kVBgf";
//上传pdf
public String uploadPdf(String pdfUrl) {
String name= "123123123.pdf";
//通过文件地址获取对应的文件流
ByteArrayOutputStream outputStream = readUrl(pdfUrl);
InputStreamReader inputStreamReader = null;
InputStream inputStream = null;
BufferedReader in = null;
try {
MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, "----------" + HEAD, Charset.defaultCharset());
multipartEntity.addPart("pdf", new ByteArrayBody(outputStream.toByteArray(), name));
HttpPost request = new HttpPost(uploadPdfUrl);
request.setEntity(multipartEntity);
//设置请求的header,设置为multipart/form-data,同时设置boundary的内容为随机字符串
request.addHeader("Content-Type", "multipart/form-data; boundary=----------" + HEAD);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);
inputStream = response.getEntity().getContent();
inputStreamReader = new InputStreamReader(inputStream);
in = new BufferedReader(inputStreamReader);
StringBuffer buffer = new StringBuffer();
String line = "";
//循环读取请求返回信息
while ((line = in.readLine()) != null) {
buffer.append(line);
}
} catch (Exception e) {
logger.error("PDF上传失败", e);
throw new ServiceException(ResponseObj.CODE_FAILED, "PDF上传失败");
} finally {
try {
//关闭文件流
outputStream.close();
in.close();
inputStream.close();
inputStreamReader.close();
} catch (IOException e) {
logger.error("数据流关闭异常", e);
throw new ServiceException(ResponseObj.CODE_FAILED, "数据流关闭异常");
}
}
return "";
}
//通过文件地址获取文件对应输出流
public ByteArrayOutputStream readUrl(String pdfUrl) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
//通过URLConnection先读出链接的输入流,再写入输出流中
//如果链接无法访问,会导致读取失败
URL url = new URL(pdfUrl);
URLConnection connection = url.openConnection();
InputStream in = connection.getInputStream();
byte[] b = new byte[1024];
int n;
while ((n = in.read(b)) != -1) {
outputStream.write(b, 0, n);
}
} catch (Exception e) {
logger.error("读取url失败", e);
throw new ServiceException(ResponseObj.CODE_FAILED, "读取url失败");
}
return outputStream;
}
通过该方式就可以正常将PDF文件通过multipart/form-data方式进行上传了。