java大文件下载代码,java和web实现大文件下载

我写了个下载程序,用Java写的,但是写完以后发现下载大文件的时候报错,内存溢出,能看看是哪的问题么?

不能一次读取完,大文件很容易内存溢出。参考下:

创新互联公司专业为企业提供翼城网站建设、翼城做网站、翼城网站设计、翼城网站制作等企业网站建设、网页设计与制作、翼城企业网站模板建站服务,10年翼城做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

public static void download(String path, HttpServletResponse response) throws Exception {   

try {   

File file = new File(path);   

if (file.exists()) {   

String filename = file.getName();   

InputStream fis = new BufferedInputStream(new FileInputStream( file));   

response.reset();   

response.setContentType("application/x-download");

response.addHeader("Content-Disposition","attachment;filename="+ new String(filename.getBytes(),"iso-8859-1"));

response.addHeader("Content-Length", "" + file.length());   

OutputStream toClient = new BufferedOutputStream(response.getOutputStream());   

response.setContentType("application/octet-stream");   

byte[] buffer = new byte[1024 * 1024 * 4];   

int i = -1;   

while ((i = fis.read(buffer)) != -1) {   

toClient.write(buffer, 0, i);  

}   

fis.close();   

toClient.flush();   

toClient.close();   

try {

response.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}  

} else {   

PrintWriter out = response.getWriter();   

out.print("script");   

out.print("alert(\"not find the file\")");   

out.print("/script");   

}   

} catch (IOException ex) {   

PrintWriter out = response.getWriter();   

out.print("script");   

out.print("alert(\"not find the file\")");   

out.print("/script");   

}   

}

java web 大文件上传下载

直接把大文件读取为IO流,之后进行上传下载即可,不用担心文件大,是可以分流下载上传的(setBufferSize(1024))。

举例:

import hkrt.b2b.view.util.Log;

import hkrt.b2b.view.util.ViewUtil;

import java.io.ByteArrayOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import org.apache.commons.net.;

import org.apache.commons.net.;

public class CCFCCBFTP {

/**

* 上传文件

*

* @param fileName

* @param plainFilePath 明文文件路径路径

* @param filepath

* @return

* @throws Exception

*/

public static String fileUploadByFtp(String plainFilePath, String fileName, String filepath) throws Exception {

FileInputStream fis = null;

ByteArrayOutputStream bos = null;

FTPClient ftpClient = new FTPClient();

String bl = "false";

try {

fis = new FileInputStream(plainFilePath);

bos = new ByteArrayOutputStream(fis.available());

byte[] buffer = new byte[1024];

int count = 0;

while ((count = fis.read(buffer)) != -1) {

bos.write(buffer, 0, count);

}

bos.flush();

Log.info("加密上传文件开始");

Log.info("连接远程上传服务器"+CCFCCBUtil.CCFCCBHOSTNAME+":"+22);

ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);

ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);

FTPFile[] fs;

fs = ftpClient.listFiles();

for (FTPFile ff : fs) {

if (ff.getName().equals(filepath)) {

bl="true";

ftpClient.changeWorkingDirectory("/"+filepath+"");

}

}

Log.info("检查文件路径是否存在:/"+filepath);

if("false".equals(bl)){

ViewUtil.dataSEErrorPerformedCommon( "查询文件路径不存在:"+"/"+filepath);

return bl;

}

ftpClient.setBufferSize(1024);

ftpClient.setControlEncoding("GBK");

// 设置文件类型(二进制)

ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

ftpClient.storeFile(fileName, fis);

Log.info("上传文件成功:"+fileName+"。文件保存路径:"+"/"+filepath+"/");

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);

}

}

}

}

/**

*下载文件

*

* @param localFilePath

* @param fileName

* @param routeFilepath

* @return

* @throws Exception

*/

public static String fileDownloadByFtp(String localFilePath, String fileName,String routeFilepath) throws Exception {

FileInputStream fis = null;

ByteArrayOutputStream bos = null;

FileOutputStream fos = null;

FTPClient ftpClient = new FTPClient();

String SFP = System.getProperty("file.separator");

String bl = "false";

try {

Log.info("下载并解密文件开始");

Log.info("连接远程下载服务器"+CCFCCBUtil.CCFCCBHOSTNAME+":"+22);

ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);

ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);

// ftpClient.connect(CMBCUtil.CMBCHOSTNAME, 2021);

// ftpClient.login(CMBCUtil.CMBCLOGINNAME, CMBCUtil.CMBCLOGINPASSWORD);

FTPFile[] fs;

ftpClient.makeDirectory(routeFilepath);

ftpClient.changeWorkingDirectory(routeFilepath);

bl = "false";

fs = ftpClient.listFiles();

for (FTPFile ff : fs) {

if (ff.getName().equals(fileName)) {

bl = "true";

Log.info("下载文件开始。");

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();

fos = new FileOutputStream(localFilePath+SFP+fileName);

fos.write(bos.toByteArray());

Log.info("下载文件结束:"+localFilePath);

}

}

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);

}

}

}

}}

备注:以上方法就实现了流的二进制上传下载转换,只需要将服务器连接部分调整为本地的实际ftp服务用户名和密码即可。

java文件下载超过4G文件错误

JVM可以调到那么大?

如果和JAVA环境相关,那就和代码无关了。(估计上面这个小文件下载没问题吧)

记得JVM只能达到物理内存的1/4?

Java 批量大文件上传下载如何实现?

解决这种大文件上传不太可能用web上传的方式,只有自己开发插件或是当门客户端上传,或者用现有的ftp等。

1)开发一个web插件。用于上传文件。

2)开发一个FTP工具,不用web上传。

3)用现有的FTP工具。

下面是几款不错的插件,你可以试试:

1)Jquery的uploadify插件。具体使用。你可以看帮助文档。

java下载服务器上的文件到客户端

java编程方法下载服务器上的文件到本地客服端,代码如下:

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileOutputStream;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStream;

import java.net.URL;

import java.net.URLConnection;

public class DownLoad {   

public static void downloadFile(URL theURL, String filePath) throws IOException {  

File dirFile = new File(filePath);

if(!dirFile.exists()){ 

//文件路径不存在时,自动创建目录

dirFile.mkdir();

}

//从服务器上获取图片并保存

URLConnection connection = theURL.openConnection();

InputStream in = connection.getInputStream();  

FileOutputStream os = new FileOutputStream(filePath+"\\123.png"); 

byte[] buffer = new byte[4 * 1024];  

int read;  

while ((read = in.read(buffer))  0) {  

os.write(buffer, 0, read);  

}  

os.close();  

in.close();

}   

public static void main(String[] args) { 

//下面添加服务器的IP地址和端口,以及要下载的文件路径

String urlPath = "http://服务器IP地址:端口/image/123.png"; 

//下面代码是下载到本地的位置

String filePath = "d:\\excel"; 

URL url = new URL(urlPath); 

try { 

downloadFile(url,filePath); 

} catch (IOException e) { 

e.printStackTrace(); 

}   

}

用Java的三大框架实现文件的上传下载,求代码啊,最好是分为action,service,serv

package cn.itcast.struts2.demo1;

import java.io.File;

import org.apache.commons.io.FileUtils;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**

* 完成文件上传 (不是解析上传内容,因为上传内容 由fileUpload拦截器负责解析)

*

* @author seawind

*

*/

public class UploadAction extends ActionSupport {

// 接收上传内容

// input type="file" name="upload" /

private File upload; // 这里变量名 和 页面表单元素 name 属性一致

private String uploadContentType;

private String uploadFileName;

public void setUpload(File upload) {

this.upload = upload;

}

public void setUploadContentType(String uploadContentType) {

this.uploadContentType = uploadContentType;

}

public void setUploadFileName(String uploadFileName) {

this.uploadFileName = uploadFileName;

}

@Override

public String execute() throws Exception {

if (upload == null) { // 通过xml配置 required校验器 完成校验

// 没有上传文件

return NONE;

}

// 将上传文件 保存到服务器端

// 源文件 upload

// 目标文件

File destFile = new File(ServletActionContext.getServletContext()

.getRealPath("/upload") + "/" + uploadFileName);

// 文件复制 使用commons-io包 提供 工具类

FileUtils.copyFile(upload, destFile);

return NONE;

}

}

多文件上传

package cn.itcast.struts2.demo1;

import java.io.File;

import org.apache.commons.io.FileUtils;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**

* 支持多文件上传

*

* @author seawind

*

*/

public class MultiUploadAction extends ActionSupport {

// 接收多文件上传参数,提供数组接收就可以了

private File[] upload;

private String[] uploadContentType;

private String[] uploadFileName;

public void setUpload(File[] upload) {

this.upload = upload;

}

public void setUploadContentType(String[] uploadContentType) {

this.uploadContentType = uploadContentType;

}

public void setUploadFileName(String[] uploadFileName) {

this.uploadFileName = uploadFileName;

}

@Override

public String execute() throws Exception {

for (int i = 0; i upload.length; i++) {

// 循环完成上传

File srcFile = upload[i];

String filename = uploadFileName[i];

// 定义目标文件

File destFile = new File(ServletActionContext.getServletContext()

.getRealPath("/upload" + "/" + filename));

FileUtils.copyFile(srcFile, destFile);

}

return NONE;

}

}


文章标题:java大文件下载代码,java和web实现大文件下载
文章分享:http://azwzsj.com/article/hcdiep.html