为了让用户下载文件,所以想整个这样的链接。但每次点击该链接,都会直接打开成一个网页的。
我见到很多网站的下载链接处,点击鼠标左键,都可以弹出一个“下载文件”的窗口,然后可以选择“保存”、“打开”(或者“运行”)和“取消”。如果选择“保存”,就显示一个类似右键——“目标另存为”的窗口,然后可以保存文件的。选择“打开”则直接用关联软件打开该文件。
请问应该怎样搞呢?
因为我的这个网页是用JAVA和JSP写得差不多了,不要告诉我ASP的方法。
谢谢!

解决方案 »

  1.   

    需要传递的参数是 filename 、 directpath 和filename2,分别对应文件名、存放该文件的相对路径 和 保存名例子:
    要下载 /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;
    }
    }
    %>
      

  2.   

    直接html搞定不就行了?
    <a href="文件路径/文件名.格式后缀" >文件名</a>
      

  3.   

    搞不懂楼上的都在说些什么……<input   name="file1"   type="file"   class="finput"   size="20">
      

  4.   

    1024表示1K,就是缓存1K
    如果是1字节,下载会非常慢另外紧接着那个while循环,可以保证全部下载
      

  5.   

    流程处理完成后指向一个servlet,给出servlet的部分代码:
    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() );
    }
    }
      

  6.   

    用<jsp:forward page="/FileDownload"> 
    <jsp:param name="fileUrl" value="<%=hostAddr %>"/>
    <jsp:param name="filePath" value="<%=fileName %>"/>
    </jsp:forward>
    这种方式指向servlet