package com.wkd.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.wkd.entity.Picture;
import com.wkd.services.PictureServices;
import com.wkd.services.Impl.PictureServicesImpl;
@SuppressWarnings("unused")
public class PictureServlet extends HttpServlet {
/**
*
*/
private PictureServices as = new PictureServicesImpl();
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String method = request.getParameter("method");
if ("Addphoto".equals(method)) {
Addphoto(request, response);
} else if ("Showphoto".equals(method)) {
Showphoto(request, response);
}
}
public void Addphoto(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
String savePath = this.getServletContext().getRealPath(
"/WEB-INF/upload");
// 上传时生成的临时文件保存目录
String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
File tmpFile = new File(tempPath);
if (!tmpFile.exists()) {
// 创建临时目录
tmpFile.mkdir();
}
// 消息提示
String message = "";
try {
// 使用Apache文件上传组件处理文件上传步骤:
// 1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
factory.setSizeThreshold(1024 * 100);// 设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB
// 设置上传时生成的临时文件的保存目录
factory.setRepository(tmpFile);
// 2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 监听文件上传进度
upload.setProgressListener(new ProgressListener() {
public void update(long pBytesRead, long pContentLength,
int arg2) {
System.out.println("文件大小为:" + pContentLength + ",当前已处理:"
+ pBytesRead);
/**
* 文件大小为:14608,当前已处理:4096 文件大小为:14608,当前已处理:7367
* 文件大小为:14608,当前已处理:11419 文件大小为:14608,当前已处理:14608
*/
}
});
// 解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
// 3、判断提交上来的数据是否是上传表单的数据
if (!ServletFileUpload.isMultipartContent(request)) {
// 按照传统方式获取数据
return;
}
// 设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB
upload.setFileSizeMax(1024 * 1024);
// 设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB
upload.setSizeMax(1024 * 1024 * 10);
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem> list = upload.parseRequest(request);
for (FileItem item : list) {
// 如果fileitem中封装的是普通输入项的数据
if (item.isFormField()) {
String name = item.getFieldName();
// 解决普通输入项的数据的中文乱码问题
String value = item.getString("UTF-8");
// value = new String(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name + "=" + value);
} else {// 如果fileitem中封装的是上传文件
// 得到上传的文件名称,
String filename = item.getName();
System.out.println(filename);
if (filename == null || filename.trim().equals("")) {
continue;
}
// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
// c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename
.substring(filename.lastIndexOf("\\") + 1);
// 得到上传文件的扩展名
String fileExtName = filename.substring(filename
.lastIndexOf(".") + 1);
// 如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
System.out.println("上传的文件的扩展名是:" + fileExtName);
// 获取item中的上传文件的输入流
InputStream in = item.getInputStream();
// 得到文件保存的名称
String saveFilename = makeFileName(filename);
// 得到文件的保存目录
String realSavePath = makePath(saveFilename, savePath);
// 创建一个文件输出流
FileOutputStream out = new FileOutputStream(realSavePath
+ "\\" + saveFilename);
// 创建一个缓冲区
byte buffer[] = new byte[1024];
// 判断输入流中的数据是否已经读完的标识
int len = 0;
// 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while ((len = in.read(buffer)) > 0) {
// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\"
// + filename)当中
out.write(buffer, 0, len);
}
// 关闭输入流
in.close();
// 关闭输出流
out.close();
// 删除处理文件上传时生成的临时文件
// item.delete();
message = "文件上传成功!";
}
}
} catch (FileUploadBase.FileSizeLimitExceededException e) {
e.printStackTrace();
request.setAttribute("message", "单个文件超出最大值!!!");
request.getRequestDispatcher("/message.jsp").forward(request,
response);
return;
} catch (FileUploadBase.SizeLimitExceededException e) {
e.printStackTrace();
request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");
request.getRequestDispatcher("/message.jsp").forward(request,
response);
return;
} catch (Exception e) {
message = "文件上传失败!";
e.printStackTrace();
}
request.setAttribute("message", message);
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
/**
* @Method: makeFileName
* @Description: 生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称
* @Anthor:孤傲苍狼
* @param filename
* 文件的原始名称
* @return uuid+"_"+文件的原始名称
*/
private String makeFileName(String filename) { // 2.jpg
// 为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
return UUID.randomUUID().toString() + "_" + filename;
}
/**
* 为防止一个目录下面出现太多文件,要使用hash算法打散存储
*
* @Method: makePath
* @Description:
* @Anthor:孤傲苍狼
*
* @param filename
* 文件名,要根据文件名生成存储目录
* @param savePath
* 文件存储路径
* @return 新的存储目录
*/
private String makePath(String filename, String savePath) {
// 得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
int hashcode = filename.hashCode();
int dir1 = hashcode & 0xf; // 0--15
int dir2 = (hashcode & 0xf0) >> 4; // 0-15
// 构造新的保存目录
String dir = savePath + "\\" + dir1 + "\\" + dir2; // upload\2\3
// upload\3\5
// File既可以代表文件也可以代表目录
File file = new File(dir);
// 如果目录不存在
if (!file.exists()) {
// 创建目录
file.mkdirs();
}
return dir;
}
public void Showphoto(HttpServletRequest request,
HttpServletResponse response) throws Servlet
没有合适的资源?快使用搜索试试~ 我知道了~
个人博客网站
共149个文件
class:33个
gif:33个
java:32个
需积分: 50 26 下载量 177 浏览量
2017-11-24
23:51:24
上传
评论 2
收藏 11.78MB ZIP 举报
温馨提示
该项目是基于java web开发的个人博客网站,所用的数据库是mysql。所用的框架是mvc。个人原创,不得转载,若有错误之处望指出。
资源推荐
资源详情
资源评论
收起资源包目录
个人博客网站 (149个子文件)
PictureServlet.class 7KB
AdminServlet.class 4KB
ArticleServlet.class 3KB
liuyanServlet.class 3KB
ArticleDAOImpl.class 3KB
AdminDAOImpl.class 3KB
DBUtil.class 3KB
LiuYanDAOImpl.class 2KB
PictureDAOImpl.class 2KB
Article.class 2KB
Admin.class 2KB
PictureServlet$1.class 1KB
dijiliang.class 1KB
critique.class 1KB
LiuYan.class 1KB
Picture.class 1022B
bloginfo.class 935B
ArticleServicesImpl.class 875B
AdminServicesImpl.class 866B
LiuYanServicesImpl.class 860B
PictureServicesImpl.class 696B
BloginfoDAOImpl.class 506B
ArticleServices.class 289B
LiuYanServices.class 286B
dijiliangDAO.class 285B
critiqueDAO.class 282B
ArticleDAO.class 272B
LiuYanDAO.class 263B
PictureServices.class 239B
AdminServices.class 233B
PictureDAO.class 221B
AdminDAO.class 218B
BloginfoDAO.class 193B
.classpath 529B
org.eclipse.wst.common.component 450B
org.eclipse.wst.jsdt.ui.superType.container 49B
main.css 8KB
ie6.css 93B
2.gif 80KB
logo.gif 4KB
bg.gif 3KB
013.gif 3KB
008.gif 3KB
003.gif 3KB
012.gif 3KB
001.gif 3KB
014.gif 3KB
015.gif 3KB
007.gif 2KB
005.gif 2KB
011.gif 2KB
006.gif 2KB
004.gif 2KB
016.gif 2KB
002.gif 2KB
date_day.gif 2KB
date_month.gif 832B
body_bg.gif 710B
footer_bg.gif 622B
folder.gif 562B
comment_bubble.gif 321B
menu_bg_hover.gif 232B
menu_bg.gif 210B
button_bg_hover.gif 203B
button_bg.gif 203B
menu_holder_bg.gif 151B
input_bg.gif 114B
top.gif 73B
bullet.gif 46B
border.gif 43B
footer_li_trim.gif 43B
mysql-connector-java-5.1.18-bin.jar 771KB
commons-io-1.3.2.jar 86KB
commons-fileupload-1.2.1.jar 56KB
PictureServlet.java 8KB
AdminServlet.java 4KB
ArticleServlet.java 3KB
DBUtil.java 2KB
liuyanServlet.java 2KB
ArticleDAOImpl.java 2KB
AdminDAOImpl.java 2KB
LiuYanDAOImpl.java 1KB
Article.java 1KB
Admin.java 1KB
PictureDAOImpl.java 1KB
LiuYan.java 732B
Picture.java 617B
critique.java 611B
ArticleServicesImpl.java 598B
bloginfo.java 579B
dijiliang.java 578B
LiuYanServicesImpl.java 544B
AdminServicesImpl.java 536B
PictureServicesImpl.java 454B
BloginfoDAOImpl.java 260B
ArticleDAO.java 246B
ArticleServices.java 210B
LiuYanServices.java 210B
AdminServices.java 195B
PictureServices.java 192B
共 149 条
- 1
- 2
资源评论
远方孤寂的狼
- 粉丝: 9
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功