一、如何将服务器的图片让浏览器显示出来?
第一步:先在web应用的根目录下放上一张图片1.jpg
第二步:在classes文件夹创建DownServlet.java
package com.java;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownServlet extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
InputStream in=new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
OutputStream out=resp.getOutputStream();
byte[] bs=new byte[1024];
int i=0;
while((i=in.read(bs))!=-1){
out.write(bs, 0, i);
}
in.close();
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req,resp);
}
}
第三步:在web.xml创建访问DownServlet路径的配置:
<servlet>
<servlet-name>DownServlet</servlet-name>
<servlet-class>com.java.DownServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownServlet</servlet-name>
<url-pattern>/java/DownServlet</url-pattern>
</servlet-mapping>
然后在浏览器访问就可以了
二、如何让图片可以下载(关键是修改DownServlet.java的功能)?
package com.java;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownServlet extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//关键部分的代码,Content-Disposition是关于文件下载的部分
resp.setHeader("Content-Disposition", "attachment;filename=1.jpg");
InputStream in=new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
OutputStream out=resp.getOutputStream();
byte[] bs=new byte[1024];
int i=0;
while((i=in.read(bs))!=-1){
out.write(bs, 0, i);
}
in.close();
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req,resp);
}
}
如果将文件名改为中文会怎么样?结果是图片可以下载,但是无法显示,文件名也无法显示(原因在于:这里是UTF-8编码无法显示中文)
如何解决这个问题?
可以利用url编码来解决?
什么是url编码?
URL编码既不是utf-8也不是gbk等我们常用的字符编码。 而是RFC1738编码(除将空格编码为加号“+”不符合外)。 类似于http://www.baidu.com/s?wd=%B9%FE%B9%FE&word=%B9%FE%B9%FE,其实就是经过RFC1738编码的URL地址。 RFC1738字符集中,将URL中除了 - _ . 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。除空格编码为加号(+)外。 我们访问的网站都会对使用RFC1738字符集的URL做出正确的解析。因为这是国际组织早就规定好了的。 DNS服务器一般不会涉及到这块,因为DNS是域名解析器,顾名思义,他只是解释http://www.baidu.com这一部分,而涉及到RFC1738字符集的大部分是后面的参数部分。 当我们在地址栏输入字符串的时候,不论你用的是什么字符集最后都会转化为使用RFC1738字符集编码的URL地址。修改后的DownServlet.java:
package com.java;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownServlet extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//resp.setHeader("Content-Disposition", "attachment;filename=美景.jpg");
//上面没有将美景转化为url编码,现在下面的就转化了
resp.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("美景.jpg","utf-8"));
InputStream in=new FileInputStream(this.getServletContext().getRealPath("美景.jpg"));
OutputStream out=resp.getOutputStream();
byte[] bs=new byte[1024];
int i=0;
while((i=in.read(bs))!=-1){
out.write(bs, 0, i);
}
in.close();
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req,resp);
}
}
ps:编码可以相互转化的,可以看下面的实例:
package com.java;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class Test01 {
public static void main(String[] args) throws UnsupportedEncodingException {
String str="中国";
String str2=URLEncoder.encode(str,"utf-8");
System.out.println(str2);
String str3=URLDecoder.decode("%E4%B8%AD%E5%9B%BD","utf-8");
System.out.println(str3);
}
}
结果输出:
%E4%B8%AD%E5%9B%BD
中国