Java通过Http请求服务器
Java通过Http请求服务器图片输出、下载、转换
Java开发过程中总会遇到从服务器中请求文件(图片、text文档等)。此处详情记录从服务器下载图片的方法,以及以多种方式输出。
1、整体流程:
建立Htpp通讯——设置请求参数——接受响应——读写响应数据——图片处理
2、代码部分
public class imageController{
//日志
private Logger logger = LoggerFactory.getLogger(getClass());
@RequestMapping("downloadImage")
@ResponseBody
public boolean downloadImage(HttpServletRequest req,HttpServletResponse resp){
logger.info("\r\n------图片下载接口开始调用------\r\n");
boolean result = false;//设置返回结果
Image image = null;
String imagePath = request.getParameter("imagePath");//获取前端传递图片路径
if(null == imagePath || "".equals(imagePath) || "null".equals(imagePath)){//判断图片路径是否为空
return result;
}
//方法一:将图片保存至本地临时文件中
File tempFile = null;
//方法二:将图片保存至本地制定目录下
File tempFile = new File("D:/image");
if(!file.exists){//判断该路径是否存在,若不存在创建目录
file.mkdir();
}
//方法四:直接输出至客户端(参数中+resp)
try{
tempFile = File.createTempFile("tempFile",".png");//设置零时文件名称、格式(文件名长度必须大于3位)
downLoad(tempFile,req);
result = true;
}catch(Exception e){
Logger.error(e.getMessage(),e);
}finally{
if(tempFile!=null){
tempFile.delete();
logger.info("\r\n------临时文件已删除------\r\n");
}
return result;//返回结果
}
}
public void downLoadToFile(File file,HttpServletRequest req){
FileOutputStream out = null;
InputStream in = null;
HttpURLConnection httpUrlConnection = null;
String urlPath = req.getParameret("urlPath");//获取前端传递请求地址
String param1 = req.getParameter("param1");//参数1
String param2 = req.getParameter("param2");//参数2
try{
//Http请求建立通讯
Url url = new Url(urlPath);
URLConnection urlConnection = url.openConnection();//打开通讯
httpUrlConnection = (HttpURLConnection)urlConnection;
//设置请求参数
httpUrlConnection.setDoOutpu(true);//是否向httpUrlConnection输出
httpUrlConnection.setDoInput(true);//是否向httpUrlConnection输入
httpUrlConnection.setRequestMethod("POST");//设置请求方式
httpUrlConnection.setUsrCaches(false);//是否设置缓存(请求凡是为post,不可以设置缓存)
httpUrlConnection.setRequestProperty("Content-type","application/x-java-serialized-object");//设定传参内容类型是可序列化的java对象
httpUrlConnection.setRequestProperty("connection","Keep-Alive");//保持与服务器链接
httpUrlConnection.setRequestProperty("Charsert","UTF-8");//设置编码
httpUrlConnection.setConnectTimeOut(3000);//设置与主机链接超时时间
httpUrlConnection.setReadTimeOut(6000);//设置从服务器读取数据超时时间
httpUrlConnection.addRequestProperty("");//不管key值是否存在直接添加
String param = "param1="+param1+"¶m2="+param2;//设置参数。参数传递另外一种方式:直接将参数param拼接在请求地址url后面
//连接
httpUrlConnection.connect();
//传递参数之后重新写入
OutputStream outputStream = httpUrlConnection.getOutputStream();
outputStream.write(param.getBytes("UTF-8"));//解决中文乱码
outputStream.flush();//清空缓冲区
outputStream.close();
//获取响应数据
in = httpUrlConnection.getInputSream();
out = new FileOutputStream(file.getPath());//文件输出流(方法一使用)
out = new FileOutputStream(file.getPath()+"/"+"文件名称");(方法二使用)
byte[] buffer = new byte[1024];//设置每次读取大小
int readLength = 0;
方法三:将流文件直接转换为Image对象
OutputStream outputStream = new OutputStream();
byte[] data = new byte[1024];
int b = 0;
while((b = in.read(data)) != -1){
outputStream.write(data,0,b);
}
BufferedImage bufferedImage = Image.read(outputStream);
outputStream.flush();
//方法四:直接将图片输出值客户端
//设置相应图片格式济缓存
resp.setHeader("content-type","image/png");
resp.setHeader("Cache-control","no-cache");
resp.setHeader("Pragma","no-cache");
OutputStream outputStream = resp.getOutputStream();//从响应中获取输出流之间图片输出值响应中
byte[] data = new byte[1024];
int b = 0;
while((b = in.read(data)) != -1){
outputStream.write(data,0,b);
}
outputStream.flush();
//方法五:输出流之间的转换
OutputStream outputStream = resp.getOutputStream();
outputStream.write(out.toByteArray());//创建一个与out大小相同的的新分配的缓存区(必须是ByteArrayOutputStream字节数组输出流之间的转换)
//将流文件读取值临时文件中
while((readLength = in.read(buffer)) > 0){
byte[] bytes = new byte[readLenght];
System.arraycopy(buffer,0,bytes,0,readLength);
out.write(bytes);
}
out.flush();
logger.info("\r\n-----文件读取成功------\r\n");
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(out != null){
out.close();
}
}catch(IOException e){
e.printStackTrace();
}
try{
if(in != null){
in.close();
}
}catch(IOException e){
e.printStackTrace();
}
if(httpUrlConnection !=null){
httpUrlConnection.disconnect();
logger.info("\r\n------通讯关闭------\r\n");
}
}
}
}
Java通过Http请求服务器的更多相关文章
- Java获取此次请求URL以及服务器根路径的方法
http://www.jb51.net/article/71693.htm ********************************************** 本文介绍了Java获取此次请求 ...
- Java发送Http请求并获取状态码
通过Java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page ...
- Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端
Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端 本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子 ...
- java 实现https请求
java 实现https请求 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很容易地编程实现对HTTPS站点的访问.但是,如果该站点的证书未经权威机构的验证,JSSE将拒绝信任该证书从 ...
- 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装
微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...
- 深入浅出Java 重定向和请求转发的区别
深入浅出Java 重定向和请求转发的区别 <span style="font-family:FangSong_GB2312;font-size:18px;">impor ...
- HttpClient请求服务器代码优化版
HttpClient请求服务器代码优化版 首先,我在前面的两篇博文中介绍了在 Android中,除了使用java.net包下HttpUrlConnection的API访问HTTP服务之外,我们还可以换 ...
- Java HttpClient伪造请求之简易封装满足HTTP以及HTTPS请求
HttpClient简介 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 jav ...
- Android使用HttpUrlConnection请求服务器发送数据详解
HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...
随机推荐
- nohub 将程序永久运行下去
今天看了一遍文章,一直以为将程序制成sh脚本,通过crontab来间隔执行以为是真的不断执行,后来才发现是错误的,每隔一段时间都会执行一次,都会占用一个进程,难怪一看进程几十来个同样名字的进程在运行 ...
- c++ 中的单例类模板的实现方法
1.什么是单例模式 在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在 ( Single Instance ).如超市收银系统,其外观主要由显示器(1个).扫描枪(1个).收款箱(1个)组 ...
- 基于RabbitMQ和Swoole实现的一个完整的异步任务系统
从最开始的使用redis实现的单进程消费的异步任务系统到加入swoole的多进程消费模式,现在,我们的异步任务系统终于又能迈进一步. 因为有了前面两个简单系统的经验,这回基于RabbitMQ的异步任务 ...
- fastdfs的入门到精通(引言和单机安装)
引言: FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线服 ...
- 大数据存储利器 - Hbase 基础图解
由于疫情原因在家办公,导致很长一段时间没有更新内容,这次终于带来一篇干货,是一篇关于 Hbase架构原理 的分享. Hbase 作为实时存储框架在大数据业务下承担着举足轻重的地位,可以说目前绝大多数大 ...
- Python生态_turtle库
Python生态_turtle库: 绘制状态函数: pendown():别名pd(),落下画笔,之后,移动画笔将绘制形状 penup():抬起画笔 pensize():画笔粗细大小 颜色控制函数: p ...
- Python基础篇(三)_函数及代码复用
Python基础篇_函数及代码复用 函数的定义.使用: 函数的定义:通过保留字def实现. 定义形式:def <函数名>(<参数列表>): <函数体> return ...
- angular 项目中遇到rxjs error TS1005:';'
因为rxjs的版本问题,只需要在package.json 中将依赖的 rxjs:'^6.00' 改为 rxjs'6.00', 然后执行 npm update 更新下rxjs的依赖版本即可解决
- I2C的基本概念和协议
概念 I2C总线是由Philips公司开发的一种简单.双向二线制同步串行总线.它只需要两根线即可在连接于总线上的器件之间传送信息. 主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任 ...
- 数据库安装和基本sql语句
数据库概念 文件作为数据进行存储,数据格式千差万别 将保存数据的地方统一起来 MYSQL--------->一款应用软件 用来帮你操作文件的 只要是基于网络通信,底层就是socket 服务端 - ...