23,409
社区成员




protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String sufix = request.getParameter("s");
String path = request.getParameter("p") + "." + sufix;
try {
String fileName = request.getParameter("f").trim();
int c = fileName.lastIndexOf(".");
String name = fileName.substring(0, c > 0 ? c : fileName.length())
+ "." + sufix;
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachement;filename="
+ new String(name.getBytes("GBK"), "ISO-8859-1"));
File file = new File(Const.getCurrentUtterlyPath() + path);
if (!file.exists()) {
throw new IOException(fileName + ",所下载的文件不存在!");
}
response.setContentLength(Integer.parseInt(file.length() + ""));
InputStream fs = new FileInputStream(file);
OutputStream os = response.getOutputStream();
byte[] buff = new byte[1024];
int readCount = 0;
while ((readCount = fs.read(buff)) != -1) {
os.write(buff, 0, readCount);
}
if (fs != null) {
fs.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
LOG.error("error: " + e.getMessage() + ",path: " + path);
throw e;
}
response.setStatus(response.SC_OK);
response.flushBuffer();
}
/** */
/**
* 从FTP服务器上下载文件,支持断点续传
*
* @param remote
* 远程文件路径
* @param local
* 本地文件路径
* @return 上传的状态
* @throws Exception
*/
public DownloadStatus downloadFile(String remote, String local)
throws Exception {
ftpClient.setControlEncoding("iso-8859-1");
FtpConnect();
// 设置被动模式
ftpClient.enterLocalPassiveMode();
// 设置以二进制方式传输
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
DownloadStatus result = null;
// 检查远程文件是否存在
FTPFile[] files = ftpClient.listFiles(new String(
remote.getBytes("utf-8"), "iso-8859-1"));
if (files.length != 1) {
//System.out.println("远程文件不存在");
return DownloadStatus.Remote_File_Noexist;
}
long lRemoteSize = files[0].getSize();
File f = new File(local + remote);
this.createDir(local + remote);
// 本地存在文件,进行断点下载
if (f.exists()) {
long localSize = f.length();
// 判断本地文件大小是否大于远程文件大小
if (localSize >= lRemoteSize) {
//System.out.println("本地文件大于远程文件,下载中止");
return DownloadStatus.Local_Bigger_Remote;
}
// 进行断点续传,并记录状态
FileOutputStream out = new FileOutputStream(f, true);
ftpClient.setRestartOffset(localSize);
InputStream in = ftpClient.retrieveFileStream(new String(remote
.getBytes("utf-8"), "iso-8859-1"));
byte[] bytes = new byte[1024];
int c;
while ((c = in.read(bytes)) != -1) {
out.write(bytes, 0, c);
}
in.close();
out.close();
boolean isDo = ftpClient.completePendingCommand();
if (isDo) {
result = DownloadStatus.Download_From_Break_Success;
} else {
result = DownloadStatus.Download_From_Break_Failed;
}
} else {
OutputStream out = new FileOutputStream(f);
InputStream in = ftpClient.retrieveFileStream(new String(remote
.getBytes("utf-8"), "iso-8859-1"));
byte[] bytes = new byte[1024];
int c;
while ((c = in.read(bytes)) != -1) {
out.write(bytes, 0, c);
}
in.close();
out.close();
boolean upNewStatus = ftpClient.completePendingCommand();
this.disconnect();
if (upNewStatus) {
result = DownloadStatus.Download_New_Success;
} else {
result = DownloadStatus.Download_New_Failed;
}
}
return result;
}