public HttpServletResponse download(String path, HttpServletResponse response) {
try {
File file = new File(path)
// 取得文件名。
String filename = file.getName()
// 取得文件的后缀名。
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase()
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(path))
byte[] buffer = new byte[fis.available()]
fis.read(buffer)
fis.close()
// 清空response
response.reset()
// 设置response的Header
response.addHeader("Content-Disposition", "attachmentfilename=" + new String(filename.getBytes()))
response.addHeader("Content-Length", "" + file.length())
OutputStream toClient = new BufferedOutputStream(response.getOutputStream())
response.setContentType("application/octet-stream")
toClient.write(buffer)
toClient.flush()
toClient.close()
} catch (IOException ex) {
ex.printStackTrace()
}
return response
}
// 下载本地文件
public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {
String fileName = "Operator.doc".toString()// 文件的默认保存名
// 读到流中
InputStream inStream = new FileInputStream("c:/Operator.doc")// 文件的存放路径
// 设置输出的格式
response.reset()
response.setContentType("bin")
response.addHeader("Content-Disposition", "attachmentfilename=\"" + fileName + "\"")
// 循环取出流中的数据
byte[] b = new byte[100]
int len
try {
while ((len = inStream.read(b)) >0)
response.getOutputStream().write(b, 0, len)
inStream.close()
} catch (IOException e) {
e.printStackTrace()
}
}
// 下载网络文件
public void downloadNet(HttpServletResponse response) throws MalformedURLException {
int bytesum = 0
int byteread = 0
URL url = new URL("windine.blogdriver.com/logo.gif")
try {
URLConnection conn = url.openConnection()
InputStream inStream = conn.getInputStream()
FileOutputStream fs = new FileOutputStream("c:/abc.gif")
byte[] buffer = new byte[1204]
int length
while ((byteread = inStream.read(buffer)) != -1) {
bytesum += byteread
System.out.println(bytesum)
fs.write(buffer, 0, byteread)
}
} catch (FileNotFoundException e) {
e.printStackTrace()
} catch (IOException e) {
e.printStackTrace()
}
}
//支持在线打开文件的一种方式
public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {
File f = new File(filePath)
if (!f.exists()) {
response.sendError(404, "File not found!")
return
}
BufferedInputStream br = new BufferedInputStream(new FileInputStream(f))
byte[] buf = new byte[1024]
int len = 0
response.reset()// 非常重要
if (isOnLine) { // 在线打开方式
URL u = new URL("file:///" + filePath)
response.setContentType(u.openConnection().getContentType())
response.setHeader("Content-Disposition", "inlinefilename=" + f.getName())
// 文件名应该编码成UTF-8
} else { // 纯下载方式
response.setContentType("application/x-msdownload")
response.setHeader("Content-Disposition", "attachmentfilename=" + f.getName())
}
OutputStream out = response.getOutputStream()
while ((len = br.read(buf)) >0)
out.write(buf, 0, len)
br.close()
out.close()
}
通常可以直接通过FTPClient 工具类下载文件到本地的,可以通过ByteArrayOutputStream进行流的读取输出。/**
*下载文件
*
* @param fileName
* @param date
* @param plainFilePath 明文文件路径路径
* @param filepath
* @return
* @throws Exception
*/
public static String encodeAESFileDownloadByFtp(String plainFilePath, String fileName, String date,String filepath) throws Exception {
FileInputStream fis = null
ByteArrayOutputStream bos = null
FileOutputStream fos = null
FTPClient ftpClient = new FTPClient()
String bl = "false"
try {
//Log.info("下载并解密文件开始")
Log.info("连接远程下载服务器"+CMBCUtil.CMBCHOSTNAME+":"+2021)
ftpClient.connect(CMBCUtil.CMBCHOSTNAME, 2021)
ftpClient.login(CMBCUtil.CMBCLOGINNAME, CMBCUtil.CMBCLOGINPASSWORD)
FTPFile[] fs
fs = ftpClient.listFiles()
for (FTPFile ff : fs) {
if (ff.getName().equals(filepath)) {
ftpClient.changeWorkingDirectory("/"+filepath+"/")
}
}
fs = ftpClient.listFiles()
for (FTPFile ff : fs) {
if (ff.getName().equals(date)) {
bl = "true"
ftpClient.changeWorkingDirectory("/"+filepath+"/" + date)
}
}
Log.info("检查文件路径是否存在:/"+filepath+"/"+date + " "+ bl)
if("false".equals(bl)){
ViewUtil.dataSEErrorPerformedCommon( "查询文件路径不存在:"+"/"+filepath+"/" + date)
return bl
}
bl = "false"
fs = ftpClient.listFiles()
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
bl = "true"
Log.info("下载并解密文件开始。")
fos = new FileOutputStream(plainFilePath)
ftpClient.setBufferSize(1024)
// 设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE)
InputStream is = ftpClient.retrieveFileStream(fileName)
bos = new ByteArrayOutputStream(is.available())
byte[] buffer = new byte[1024]
int count = 0
while ((count = is.read(buffer)) != -1) {
bos.write(buffer, 0, count)
}
bos.flush()
byte[] bytes = decodeAES(key, bos.toByteArray())
fos = new FileOutputStream(plainFilePath)
fos.write(bytes)
Log.info("下载并解密文件结束:"+plainFilePath)
}
}
Log.info("检查文件是否存:"+fileName+" "+bl)
if("false".equals(bl)){
ViewUtil.dataSEErrorPerformedCommon("查询无结果,请稍后再查询。")
return bl
}
return bl
} catch (Exception e) {
throw e
} finally {
if (fis != null) {
try {
fis.close()
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e)
}
}
if (bos != null) {
try {
bos.close()
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e)
}
}
if (fos != null) {
try {
fos.close()
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e)
}
}
}
}
举例代码:
/*** 下载文件。
* @param urlStr 文件的URL
* @param savePath 保存到的目录
* @param fileName 保存的文件名称
* @param description 描述(如:歌曲,专辑封面,歌词等)
* @throws IOException
*/
public static void downLoad(String urlStr, String savePath, String fileName, String description) throws IOException
{
URL url = new URL(urlStr)
HttpURLConnection conn = (HttpURLConnection) url.openConnection()
conn.setConnectTimeout(100000) // 设置超时间为10秒
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible MSIE 5.0 Windows NT DigExt)") // 防止屏蔽程序抓取而返回403错误
File saveDir = new File(savePath)
File file = new File(saveDir + File.separator + fileName)
try (InputStream inputStream = conn.getInputStream()
FileOutputStream fos = new FileOutputStream(file))
{
byte[] flowData = readInputStream(inputStream)
fos.write(flowData)
} catch (Exception e) {
MainFrame.logEvent("字节保存时出现意外:" + e.getMessage())
}
MainFrame.logEvent(description + "下载完成:" + url)
}
MainFrame.logEvent()是我自己弄的日志记录而已,可以忽略不看
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)