java 写一个action 能实现点击事件后浏览器能自动下载xml文件的功能!!急

java 写一个action 能实现点击事件后浏览器能自动下载xml文件的功能!!急,第1张

方法一:调用浏览器下载文件

下面Action里的代码可以用调用浏览器进行下载xml文件

import java.awt.Desktop

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.net.URI

import javax.swing.JButton

import javax.swing.JFrame

public class DownLoadDemo extends JFrame {

JButton jb

public DownLoadDemo() {

jb = new JButton("Download")

jb.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

try {

String path = "网络xml的地址"

URI uri = new URI(path)

Desktop.getDesktop().browse(uri)

} catch (Exception e1) {

e1.printStackTrace()

}

}

})

add(jb)

setTitle("调用浏览器下载")

setBounds(380, 380,230,80)

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

setVisible(true)

}

public static void main(String[] args) {

new DownLoadDemo()

}

}

当时上述下载方式,可能会d出提示,比如保存位置等.

方法二:使用IO和net下载文件.这种方式没有调用浏览器,下载过程,不会d出提示灯

import java.io.FileOutputStream

import java.io.InputStream

import java.net.URL

import java.net.URLConnection

import java.util.Date

public class DownLoadDemo {

public static void main(String[] args) throws Exception {

String str = "XML的网络地址"

URL url = new URL(str)

URLConnection urlconn = url.openConnection()

urlconn.connect()

InputStream is = urlconn.getInputStream()

FileOutputStream fos = new FileOutputStream("qq.exe")

byte[] buf = new byte[4096]

int length = 0

//System.out.println("开始下载时间:"+new Date())

while((length=is.read(buf))!=-1){

fos.write(buf, 0, length)

}

fos.close()

is.close()

//System.out.println("下载完成时间:"+new Date())

}

}

我用struts2给你实现:

1.首先struts2.xml 里面

<action name="download" class="com.zfj.action.DownloadAction">

<!-- 注意这里不再是返回一个字符串找到一个页面了

从服务器返回到本地客户端是一个流 我们需要配置流信息

type:表示接受方式或者跳转方法

默认是 dispatcher 请求转发,所以之前我们一般不书写这个参数但是这里需要更改为stream重定向

-->

<result type="stream">

<!--

因为之前我们设置的execute方法返回一个String,但是我们现在需要返回一个流。这里我们要指定一个新的方法为我们处理业务逻

辑并且返回流所以默认execute 方法对我们没有作用了,在这里我们指定一个新的方法为我们处理业务逻辑并且最后返回流

这里的inputName是固定写法 后面的名字dname要跟 action里面的getDname对应

-->

<param name="inputName">dname</param>

<!-- 当流返回过来时,我们应当设置头信息

给浏览器,这里设置的都是流信息

name里面的是固定写法

attachment:表示使用附件下载

online:直接打开

分号后的filename是固定写法,后面通过一个ognl表达式

引用下载的文件名

-->

<param name="contentDisposition">attachmentfilename=${filename}</param>

</result>

</action>

这里不再是返回一个字符串找到一个页面了。从服务器返回到本地客户端是一个流,我们需要配置流信息。

type:表示接受方式或者跳转方式是(默认是dispathcher请求转发,所以之前我们一般不书写这个,但是这里下载需要更改stream)

2.对应的DownloadAction

@Override

public String execute() throws Exception {

return this.SUCCESS

}

//这里的getEtoak要跟struts.xml里的inputName的值对应

public InputStream getEtoak() throws Exception {

return new FileInputStream(

ServletActionContext.getServletContext()

.getRealPath("/image")

+ "/"

+ this.getFilename())

}

<a href="control/downFile.do?pistrPath=' + rec.get('path') + '">'

请求到后台,把文件地址传到后台

/**

* 下载文件

* @param pistrPath

* @param piobjResponse

* @throws MalformedURLException

*/

public void downloadNet(String pistrPath, HttpServletResponse piobjResponse) throws MalformedURLException {

// 下载网络文件

int iByte = 0

System.getProperties()

try {

URL objurl = new URL(pistrPath)

System.out.println(pistrPath)

URLEncoder.encode(objurl.toString(), SengisConstant.STR_CN_ENCODE)

URLConnection objConn = objurl.openConnection()

InputStream objInputStream = objConn.getInputStream()

OutputStream objOutStream = piobjResponse.getOutputStream()

byte[] arrByte = new byte[1204]

while ((iByte = objInputStream.read(arrByte)) != -1) {

objOutStream.write(arrByte, 0, iByte)

}

objOutStream.flush()

objOutStream.close()

objInputStream.close()

} catch (FileNotFoundException e) {

e.printStackTrace()

} catch (IOException e) {

e.printStackTrace()

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/tougao/12098043.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存