问题:在WEB项目A中访问另一个WEB项目B,通过A向B中上传下载文件
上传:
HttpPost httpPost = new HttpPost(upload_url); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式 builder.addBinaryBody("file" , file, ContentType.MULTIPART_FORM_DATA, path);// 文件流 builder.addTextBody("filename", path);// 类似浏览器表单提交,对应input的name和value HttpEntity entity = builder.build(); httpPost.setEntity(entity); HttpResponse response = httpClient.execute(httpPost);// 执行提交
下载:
String url = download_url + URLEncoder.encode(path, "UTF-8"); CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet httpget = new HttpGet(url); HttpResponse response = httpclient.execute(httpget); entity = response.getEntity(); InputStream in = entity.getContent();
注意点:
文件下载获取输入流后
1、直接调用 in.available() 时,返回为0。原因:网络通讯往往是间断性的,一串字节往往分几批进行发送
2、为解决上述问题,在调用 in.available() 前,先调用 in.read() 方法。使用该方法处理时,不能获取完整文件流
int firstByte = inputStream.read(); int length = inputStream.available(); byte[] bytes = new byte[length+1]; bytes[0] = (byte)firstByte; inputStream.read(bytes,1,length); inputStream.close();
3、该问题出现原因同样是因为网络文件流不稳定,解决方法是循环读取
ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int n=0; while (-1 != (n = inputStream.read(buffer))) { output.write(buffer, 0, n); } byte[] bytes = output.toByteArray();