我擦,今天搞了许多!
首选弄了个struts的框架,当然是在网上找的。
package org.usc.file;
import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
public class DownloadAction extends ActionSupport
{
private static final long serialVersionUID = 6329383258366253255L;
private String fileName;
private String fileRealName;
ActionContext context = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse) context.get(ServletActionContext.HTTP_RESPONSE);
Map session = context.getSession();
public void setFileName()
{
// 得到请求下载的文件名
String fname = ServletActionContext.getRequest().getParameter("name");
String frealname = ServletActionContext.getRequest().getParameter("realname");
try
{
/*
* 对fname参数进行UTF-8解码,注意:实际进行UTF-8解码时会使用本地编码,本机为GBK。
* 这里使用request.setCharacterEncoding解码无效.
* 只有解码了getDownloadFile()方法才能在下载目录下正确找到请求的文件
*/
fname = new String(fname.getBytes("ISO-8859-1"), "UTF-8");
frealname= new String(frealname.getBytes("ISO-8859-1"), "UTF-8");
} catch (Exception e)
{
e.printStackTrace();
}
this.fileName = fname;
this.fileRealName = frealname;
System.out.println(fileName);
System.out.println(fileRealName);
}
/*
* @getFileName 此方法对应的是struts.xml文件中的: attachment;filename="${fileName}"
* 这个属性设置的是下载工具下载文件时显示的文件名, 要想正确的显示中文文件名,我们需要对fileName再次编码
* 否则中文名文件将出现乱码,或无法下载的情况
*/
public String getFileName() throws UnsupportedEncodingException
{
fileRealName = new String(fileRealName.getBytes(), "ISO-8859-1");
return fileRealName;
}
/*
* @getDownloadFile 此方法对应的是struts.xml文件中的: downloadFile 返回下载文件的流,可以参看struts2的源码
*/
public InputStream getDownloadFile()
{
this.setFileName();
String path=request.getRealPath("\");
File file=new File(path+fileName);
int fileSize=-1;
if(file.exists()){
fileSize=(int) file.length();
System.out.println("文件存在"+file.getPath()+" "+fileSize);
}else
System.out.println("文件不存在"+file.getPath());
response.setContentLength(fileSize);
return ServletActionContext.getServletContext().
getResourceAsStream("/"+"/"
+ fileName);
}
@Override
public String execute() throws Exception
{
return SUCCESS;
}
}
/upload.jsp
/upload.jsp
/download.jsp
attachment;filename="${fileName}"
downloadFile
首先是要做一个struts版的文件服务器,提供下载用!
然后用一个多线程,断点续传的代码下载这个struts链接,发现我擦,下载不了。
故而debug了半天,发现(红色字体)struts默认的IOoutputstream没有把他传的文件大小写到http报的头上,所以断点续传代码无法获得他的大小,所以无法计算。
后来就行了
2.(紫色字体)String path=request.getRealPath(“\”);是得到该jsp文件的根目录
ActionContext context = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse) context.get(ServletActionContext.HTTP_RESPONSE);
Map session = context.getSession();
这些是得到环境里的那7个属性
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net