为了让用户下载文件,所以想整个这样的链接。但每次点击该链接,都会直接打开成一个网页的。
我见到很多网站的下载链接处,点击鼠标左键,都可以弹出一个“下载文件”的窗口,然后可以选择“保存”、“打开”(或者“运行”)和“取消”。如果选择“保存”,就显示一个类似右键——“目标另存为”的窗口,然后可以保存文件的。选择“打开”则直接用关联软件打开该文件。
请问应该怎样搞呢?
因为我的这个网页是用JAVA和JSP写得差不多了,不要告诉我ASP的方法。
谢谢!
我见到很多网站的下载链接处,点击鼠标左键,都可以弹出一个“下载文件”的窗口,然后可以选择“保存”、“打开”(或者“运行”)和“取消”。如果选择“保存”,就显示一个类似右键——“目标另存为”的窗口,然后可以保存文件的。选择“打开”则直接用关联软件打开该文件。
请问应该怎样搞呢?
因为我的这个网页是用JAVA和JSP写得差不多了,不要告诉我ASP的方法。
谢谢!
要下载 /abc/files/file1.gif ,保存为file2.gif
其中abc为工程路径,files为相对路径,file1.gif为文件名
假设JSP名称为 download.jsp
则请求的路径为 download.jsp?filename=file1.gif&directpath=files&filename2=file2.gif
特别注意:请求的路径不能是localhost,否则会直接打开(可以用127.0.0.1)<%@page language="java" contentType="application/x-msdownload" import="java.io.*,java.net.*" pageEncoding="gb2312"%>
<%
String filename = request.getParameter("filename");//文件名
String filename2 = request.getParameter("filename2");//文件名
String directpath= request.getParameter("directpath");//路径
String filepath = this.getClass().getClassLoader().getResource("/").getPath().replaceAll("%20"," ");//路径
//filepath="http://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"+filename;
response.reset();//可以加也可以不加
response.setContentType("application/x-download");//设置为下载application/x-download
filename = URLEncoder.encode(filename,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filename2);
//判断返回路径有WEB-INF时切掉,若是没有就不执行。
if(filepath.indexOf("WEB-INF")!=-1){
filepath = filepath.substring(0,filepath.indexOf("WEB-INF")-1);
}
OutputStream output = null;
FileInputStream fis = null;
try
{
output = response.getOutputStream();
fis = new FileInputStream(filepath+"/"+directpath+"/"+filename); byte[] b = new byte[1024];
int i = 0; while((i = fis.read(b)) > 0)
{
output.write(b, 0, i);
}
output.flush();
}
catch(Exception e)
{
System.out.println("Error!");
e.printStackTrace();
}
finally
{
if(fis != null)
{
fis.close();
fis = null;
}
if(output != null)
{
output.close();
output = null;
}
}
%>
<a href="文件路径/文件名.格式后缀" >文件名</a>
如果是1字节,下载会非常慢另外紧接着那个while循环,可以保证全部下载
public void doPost( HttpServletRequest req, HttpServletResponse res )
{
try
{
// 获取暂存目录
String tempDirectory = LianaStandard.getSelfDefineSettingsValue( SETTING_NAME_FILEDOWNLOAD_TEMPDIR );
// 获取本地地址
String hostAddr = LianaStandard.getSelfDefineSettingsValue( FileUploadServlet.SETTING_NAME_FILEUPLOAD_HOSTADDR );
// 获取上存档案目录
String fileDirectory = LianaStandard.getSelfDefineSettingsValue( FileUploadServlet.SETTING_NAME_FILEUPLOAD_FILEDIR );
String serverURL = null; // 要下载文件的URL(包括端口)
String aFilePath = null; // 要下载的文件路径(包括文件名称)
String aFileName = null; // 要下载的文件名称
FileInputStream inToUser = null; // 返回给用户的输入流
ServletOutputStream outToUser = null; // 返回给用户的输出流
HttpURLConnection urlcon = null; // 连接远程服务器的链接
InputStream inFromServer = null; // 本地服务器接受远程服务器文件的输入流
File tempFile = null;
try
{
// 得到文件的URL和Path
serverURL = req.getParameter( PARAM_SERVER_ADDRESS );
aFilePath = req.getParameter( PARAM_FILE_PATH );
aFileName = aFilePath.substring( aFilePath.lastIndexOf( "/" ) + 1 );
if ( serverURL.indexOf( hostAddr ) < 0 )
{
// 如果不是本地,从其他服务器读取文件
String requestURL = PARAM_SERVER_ADDRESS + "=" + serverURL + "&" + PARAM_FILE_PATH + "="
+ aFilePath;
String servletPort = serverURL.substring( serverURL.lastIndexOf( ":" ) + 1 );// 要下载文件的服务器端口号
serverURL = serverURL.substring( 0, serverURL.lastIndexOf( ":" ) );// 要下载文件的服务器IP
URL url = new URL( "http", serverURL, Integer.parseInt( servletPort ), SERVLET_URL );
urlcon = (HttpURLConnection) url.openConnection();
urlcon.setDoOutput( true );
OutputStreamWriter outToServer =
new OutputStreamWriter(
new BufferedOutputStream( urlcon.getOutputStream() ), FILE_ENCODING );
outToServer.write( requestURL );
outToServer.flush(); // 读入文件
inFromServer = urlcon.getInputStream();
// 创建temp文件
tempFile = new File( tempDirectory + aFileName );
tempFile.createNewFile();
FileOutputStream outToTempFile = new FileOutputStream( tempFile );
BufferedOutputStream bosToTempFile = new BufferedOutputStream(outToTempFile); // 文件传输
int data;
while ( (data = inFromServer.read()) != -1 )
{
bosToTempFile.write( data );
}
bosToTempFile.flush();
outToTempFile.flush();
}
else
{
// 如果是本地将临时文件指向本地文件
tempFile = new File( fileDirectory + aFilePath );
if ( !tempFile.exists() )
{
tempFile = new File( tempDirectory + "ErrorFile" );
if ( !tempFile.exists() )
{
tempFile.createNewFile();
}
}
}
inToUser = new FileInputStream( tempFile ); // 读入文件
//如果文件长度为0,则默认为错误文件
// String toUserFileName = null;
// if(tempFile.length() == 0){
// toUserFileName = "errorFile";
// }else{
// toUserFileName = tempFile.getName();
// }
// 返回给用户
res.setHeader( "Content-disposition", "attachment; filename=" + tempFile.getName() );
outToUser = res.getOutputStream();
outToUser.flush();
int aRead ;
while ( (aRead = inToUser.read()) != -1 )
{
outToUser.write( aRead );
}
outToUser.flush();
}
catch ( IOException ex )
{
Trace.trace( true, LOG_ID, Trace.High, Trace.Error, "", ex.getMessage() );
}
finally
{
try
{
if ( urlcon != null )
urlcon.disconnect();
if ( inToUser != null )
inToUser.close();
if ( outToUser != null )
outToUser.close();
if ( inFromServer != null )
inFromServer.close();
}
catch ( IOException ex )
{
Trace.trace( true, LOG_ID, Trace.High, Trace.Error, "", ex.getMessage() );
}
}
}
catch ( CTEObjectNotFoundException ex1 )
{
// Trace.trace( true, LOG_ID, Trace.High, Trace.Error, "", ex1.getMessage() );
}
}
<jsp:param name="fileUrl" value="<%=hostAddr %>"/>
<jsp:param name="filePath" value="<%=fileName %>"/>
</jsp:forward>
这种方式指向servlet