可以有2种方式,1:目录映射,2:读取流
方式1:
需要在conf目录下对server.xml做修改,就是在<host></host>标签之间加入
<Context path="images" docBase="D:\pictureFiles" debug="0"/> //映射D盘pictrueFiles文件夹到项目路径
然后在web页面访问文件夹下图片如下:
<img src="/images/1.jpg" />
方式2:
实现用HTTP连接获取一张图片,在servlet中转为流之后输出,这样访问一个service之后就能直接得到图片流并显示出来
类似于访问一个图片的src(html)中会向一个http://localhost:8080/webproj/i.jpg发送请求,于是浏览器就会显示这张图片出来,现在要实现一个后台的service,做的是同样的事情但是请求的却是service,而这个service就返回了图片流回来
/**
* 获取图片
* @param request
* @param response
*/
public void GetImage(HttpServletRequest request
, HttpServletResponse response){
try {
URL url = new URL("http://csdnimg.cn/www/images/csdnindex_logo.gif");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
byte data[] = readInputStream(inStream);
inStream.read(data); //读数据
inStream.close();
response.setContentType("image/jpg"); //设置返回的文件类型
OutputStream os = response.getOutputStream();
os.write(data);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static byte[] readInputStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[2048];
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
/**
* 上传首页图片
* @param request
* @param response
*/
public void UploadHomeImage(HttpServletRequest request
, HttpServletResponse response){
//存储文件,同时获取表单中的输入值对
Map<String, String> nameValuePair = new HashMap<String, String>();
//户型图片存储对象
HomeImage homeImage = new HomeImage();
//获取存储的地址,同时捕获参数值对
String imageUrl = saveUploadFile(request, "/Upload/HomeImage/", nameValuePair);
homeImage.setImageUrl(imageUrl);
homeImage.setUploadDate(new Date());
settingService.saveOrUpdateHomeImage(homeImage);
//获取信息界面显示类
HomeImagePage responsePage = settingService.getWebHomePage();
//将页面显示数据类转化为JSON,返回前端
responseOutWithJson(response, responsePage);
response.setStatus(HttpServletResponse.SC_OK);
}
采用nutz框架实现的:
@At("/getSrcImg")
public void getSrcImg(HttpServletRequest request, HttpServletResponse response,String fileName){
System.out.println("getSrcImg, fileName="+fileName);
try {
String tPath = "E:\\img\\" + fileName;
byte data[] = FileUtils.getFileContent(tPath);
response.setContentType("image/jpg"); //设置返回的文件类型
OutputStream os = response.getOutputStream();
os.write(data);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("test");
}
/**
* 获取文件内容
* @param filePath
* @return
* @throws IOException
*/
public static byte[] getFileContent(String filePath) throws IOException {
File file = new File(filePath);
long fileSize = file.length();
if (fileSize > Integer.MAX_VALUE) {
System.out.println("file too big...");
return null;
}
FileInputStream fi = new FileInputStream(file);
byte[] buffer = new byte[(int) fileSize];
int offset = 0;
int numRead = 0;
while (offset < buffer.length
&& (numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {
offset += numRead;
}
// 确保所有数据均被读取
if (offset != buffer.length) {
throw new IOException("Could not completely read file "
+ file.getName());
}
fi.close();
return buffer;
}
据说这种方式比较耗内存,如果图像很大,比如10多M的话,改成流式会好点