当我们需要在Java程序中实现文件上传和下载的功能时,可以采用Java的IO类来实现。下面是实现上传和下载功能的步骤。
1. 上传文件
1.1 上传文件的前端HTML页面
在上传文件的前端页面中,我们需要使用到input标签和form标签。如下所示:
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="Upload" />
</form>
其中,action属性指定上传的路径,method属性指定请求的方法为POST,enctype属性指定表单的 MIME 类型为multipart/form-data。
1.2 实现文件上传的后端Java程序
我们可以使用Java的IO类来完成文件上传功能。如下所示:
@RequestMapping(value = "/upload", method = RequestMethod.POST, produces = "text/plain;charset=UTF-8")
@ResponseBody
public String upload(HttpServletRequest request) {
try {
// 获取上传文件的流和文件名
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile file = multipartRequest.getFile("file");
String fileName = file.getOriginalFilename();
// 设置上传文件的路径
String filePath = "path/";
// 开始上传文件
InputStream inputStream = file.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(filePath + fileName);
byte[] buffer = new byte[1024];
int length = 0;
while ((length = inputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, length);
}
fileOutputStream.close();
inputStream.close();
return "上传成功!";
} catch (Exception e) {
return "上传失败!";
}
}
首先,我们要在Controller类中加上@RequestMapping注解来指定请求的 URL 和方法类型。该方法的参数为 HttpServletRequest,可以通过该参数获取上传的文件流和文件名。然后指定上传文件的路径,并根据文件名创建一个新的文件。最后,不断读取上传文件的流,并将读取到的内容写到新创建的文件中。
2. 下载文件
2.1 下载文件的前端HTML页面
在下载文件的前端页面中,我们需要使用到HTML的a标签,并在标签的href属性中指定要下载的文件路径。如下所示:
<a href="/download/file" download="file">Download</a>
其中,href属性指定要下载的文件路径,download属性指定下载文件的名称。
2.2 实现文件下载的后端Java程序
我们也可以使用Java的IO类来完成文件下载功能。如下所示:
@RequestMapping("/download/{fileName}")
public ResponseEntity<byte[]> download(@PathVariable("fileName") String fileName) throws IOException {
File file = new File("path/" + fileName);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", fileName);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}
使用 @RequestMapping 注解指定请求的 URL,方法中的 @PathVariable 注解用于获取 URL 中的参数。然后使用 Java 的 IO 类读取文件,并通过 ResponseEntity 将文件以流的形式返回给客户端。其中,headers.setContentType(MediaType.APPLICATION_OCTET_STREAM) 用于指定返回的文件类型,headers.setContentDispositionFormData("attachment", fileName) 用于设置下载文件的名称。
示例1:实现通过Java上传文件到FTP服务器中
public class FtpUtil {
private String ftpHost = "***";
private String ftpUserName = "***";
private String ftpPassword = "***";
private int ftpPort = 21;
private String ftpPath = "/";
public FtpUtil() {
}
/**
* 上传文件
*
* @param fileName 文件名称
* @param input 文件流
* @return boolean
*/
public boolean uploadFile(String fileName, InputStream input) {
boolean success = false;
FTPClient ftp = new FTPClient();
ftp.setControlEncoding("GBK");
try {
int reply;
ftp.connect(ftpHost, ftpPort);
ftp.login(ftpUserName, ftpPassword);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
ftp.enterLocalPassiveMode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
if (!ftp.changeWorkingDirectory(ftpPath)) {
ftp.makeDirectory(ftpPath);
ftp.changeWorkingDirectory(ftpPath);
}
if (ftp.storeFile(fileName, input)) {
success = true;
}
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
}
示例2:实现通过Java从FTP服务器中下载文件到本地
public class FTPUtil {
private static final String FTP_ADDRESS = "***";
private static final String FTP_PORT = "***";
private static final String FTP_USERNAME = "***";
private static final String FTP_PASSWORD = "***";
private static final String FTP_BASEPATH = "***";
/**
* 从FTP服务器下载文件
*
* @param localPath 下载至本地的路径
* @param remotePath FTP服务器中文件的路径
* @param fileName 文件名称
* @return boolean
*/
public static boolean downloadFile(String localPath, String remotePath, String fileName) {
boolean success = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(FTP_ADDRESS, Integer.parseInt(FTP_PORT));
ftp.login(FTP_USERNAME, FTP_PASSWORD);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
ftp.changeWorkingDirectory(FTP_BASEPATH);
ftp.enterLocalPassiveMode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
File localFile = new File(localPath + File.separatorChar + fileName);
OutputStream os = new FileOutputStream(localFile);
if (ftp.retrieveFile(remotePath + fileName, os)) {
success = true;
}
os.close();
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
}
这两个示例展示了在Java程序中实现上传和下载文件的两种方式。第一个示例演示了如何通过Java程序将文件上传到FTP服务器中,第二个示例演示了如何通过 Java 程序从 FTP 服务器中下载文件到本地。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现上传和下载工具类 - Python技术站