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");
}
}
}
}
往外张望的人在做梦,向内审视的人才是清醒的