服务器以流的形式返回一个本地文件给请求方
对于请求方来说,下载来的文件是透明的,就是这个文件的格式和名字都是需要重命名的,这是以流的形式下载文件的一个特点。
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
public class FileTest {
public static void main(String [] args){
FileTest ft=new FileTest();
ft.test1();
}
//----------------------------test1
public void test1(){
ActionContext ctx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE);
//声明流对象
FileInputStream fis=null;
String s="";
try {
//创建流对象
fis=new FileInputStream("d:\\a\\123.txt");
//读取数据,并将读取到的数据存储到数组中
byte[] data=new byte[1024];//数据存储的数组
int i=0;//当前下标
//读取流中的第一个字节数据
int n=fis.read();
//依次读取后续的数据
while(n!=-1){//未到达流的末尾
//将有效数据存储到数组中
data[i]=(byte)n;
//下标增加
i++;
//读取下一个字节的数据
n=fis.read();
}
//解析数据
s=new String(data,0,i);
//输出字符串
System.out.println(s);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
response.setCharacterEncoding("UTF-8");// 解决接受端的中文乱码问题
PrintWriter printWriter;
try {
printWriter = response.getWriter();
printWriter.write(s);// 返回的json串
printWriter.flush();
printWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//----------------------------test1
//____________________________test2
public void test2() throws Exception{
String getURL="http://192.168.1.104:8080/struts2go/fileTest/test1.action;
URL getUrl = new URL(getURL);
// 根据拼凑的URL,打开连接,URL.openConnection函数会根据URL的类型,
// 返回不同的URLConnection子类的对象,这里URL是一个http,因此实际返回的是HttpURLConnection
HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();
// 进行连接,但是实际上get request要在下一句的connection.getInputStream()函数中才会真正发到
// 服务器
connection.setConnectTimeout(25000);
connection.setReadTimeout(25000);
connection.connect();
int status = connection.getResponseCode();
if (status == 200) {
DataInputStream in = new DataInputStream( connection.getInputStream());
DataOutputStream out = new DataOutputStream(new FileOutputStream("d:\\a\\新文件.zip"));
byte[] buffer = new byte[4096];
int count = 0;
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
}
out.close();
in.close();
} else {
String strResponse = "error";
}
connection.disconnect();
}
//____________________________test2
}