JavaWeb实现文件上传下载功能实例解析
一、文件上传
文件上传是指将本地机器上的文件通过网络传输到远程服务器上的过程。在JavaWeb中,可以使用Servlet实现文件上传功能。
在上传文件之前,需要先创建一个表单,让用户选择需要上传的文件。具体操作如下:
- 在HTML中创建一个表单,指定表单的enctype属性值为"multipart/form-data",表单中包含一个file类型的input元素:
<form action="uploadServlet" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
- 在Servlet中处理上传的文件。获取上传的文件需要使用到requset.getParts()方法。该方法返回一个Part的集合,我们可以使用for循环对其中的每个Part进行处理。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
Collection<Part> parts = request.getParts();
for (Part part : parts) {
String fileName = getFileName(part);
if (fileName != null && !"".equals(fileName)) {
part.write("D:/" + fileName); // 将上传的文件保存到D盘目录下
}
}
}
private String getFileName(Part part) {
String contentDisposition = part.getHeader("Content-Disposition");
if (contentDisposition == null) {
return null;
}
String[] attrs = contentDisposition.split(";");
for (String attr : attrs) {
if (attr.trim().startsWith("filename=")) {
return attr.substring(attr.indexOf('=') + 1).trim().replace("\"", "");
}
}
return null;
}
二、文件下载
文件下载是指将服务器上的文件发送到客户端,让客户端可以下载到本地机器上。在JavaWeb中,可以使用Servlet实现文件下载功能。
在下载文件之前,需要先在Servlet中指定要下载的文件,并将该文件的InputStream中的数据写入到ServletOutputStream中,最后发送给客户端即可。具体操作如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filePath = "D:/test.txt"; // 下载的文件路径
File file = new File(filePath);
if (!file.exists()) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(file));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
} finally {
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
}
}
以上是JavaWeb实现文件上传下载功能的完整攻略,以下是两个实用的案例:
示例1:上传图片,并将图片展示在页面上
HTML代码
<form action="uploadServlet" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/png, image/jpeg, image/gif">
<input type="submit" value="上传">
</form>
<!-- 展示图片 -->
<img src="">
<script>
// 图片上传成功后,将该图片展示在页面上
function handleFile() {
var file = document.querySelector('input[type=file]').files[0];
var reader = new FileReader();
reader.onload = function(event) {
document.querySelector('img').setAttribute('src', event.target.result);
};
reader.readAsDataURL(file);
}
document.querySelector('input[type=file]').addEventListener('change', handleFile);
</script>
Servlet代码:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Collection<Part> parts = request.getParts();
for (Part part : parts) {
if ("image".equals(part.getName())) {
String fileName = getFileName(part);
if (fileName != null && !"".equals(fileName)) {
part.write("D:/" + fileName); // 将上传的图片保存到D盘目录下
String imageUrl = "/images/" + fileName;
response.getWriter().write(imageUrl);
}
}
}
}
private String getFileName(Part part) {
String contentDisposition = part.getHeader("Content-Disposition");
if (contentDisposition == null) {
return null;
}
String[] attrs = contentDisposition.split(";");
for (String attr : attrs) {
if (attr.trim().startsWith("filename=")) {
return attr.substring(attr.indexOf('=') + 1).trim().replace("\"", "");
}
}
return null;
}
示例2:下载文件并限制下载速度
Servlet代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filePath = "D:/test.pdf"; // 下载的文件路径
File file = new File(filePath);
if (!file.exists()) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
// 控制下载速度
response.setBufferSize(4096); // 每次读取的字节数
long fileSize = file.length(); // 文件总大小
long start = 0;
long end = fileSize - 1;
String range = request.getHeader("Range");
if (range != null && range.matches("^bytes=\\d*-\\d*$")) {
String[] bytes = range.substring(6).split("-");
start = Long.parseLong(bytes[0]);
end = Long.parseLong(bytes.length > 1 && !"".equals(bytes[1]) ? bytes[1] : (fileSize - 1) + "");
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
}
response.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileSize);
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(file));
bis.skip(start);
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[4096];
long length = end - start + 1;
int len;
long count = 0;
long time = System.currentTimeMillis();
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
count += len;
if (count >= length) {
break;
}
long nowTime = System.currentTimeMillis();
if (nowTime - time >= 1000) {
synchronized (this) {
try {
wait(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
time = nowTime;
}
}
} finally {
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
}
}
其中,通过设置response的BufferSize属性来控制每次读取的字节数,在循环读取文件内容时,控制每秒输出文件的字节数来控制下载速度,使用synchronized来防止CPU瞎忙。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaWeb实现文件上传下载功能实例解析 - Python技术站