我们在网上看见的很多图片资源和上传QQ头像是如何进行上传的呢,这里借助了smartupload的工具包,首先导入包,然后接下来前端页面会用到jsp所以要把jsp相关的工具包也导入。
上传操作:
前端页面使用表单post请求服务器
<form action="/onload" method="post" enctype="multipart/form-data">
<input type="text" name="uname">
选择文件<input type="file" name="file">
<input type="submit" value="上传">
</form>
现在来看看onload的代码
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建上传文件对象
SmartUpload file = new SmartUpload();
PageContext pageContext = JspFactory.getDefaultFactory().
getPageContext(this,req,resp,null,false,1024,true);
//初始化上传操作
file.initialize(pageContext);
//设置编码
file.setCharset("utf-8");
//上传
try {
file.upload();
} catch (SmartUploadException e) {
e.printStackTrace();
}
//获取文件信息
File file1 = file.getFiles().getFile(0);
String fileName = file1.getFileName();
String contentType = file1.getContentType();
System.out.println(contentType);
//指定上传的路径
String path = "/file/"+fileName;
//保存位置
try {
//虚拟路径
file1.saveAs(path,File.SAVEAS_VIRTUAL);
req.setAttribute("filename",fileName);
req.getRequestDispatcher("/success.jsp").forward(req,resp);
} catch (SmartUploadException e) {
e.printStackTrace();
}
//获取文本信息
String uname = file.getRequest().getParameter("uname");
System.out.println(uname);
}
选中文件进行上传提交表单
转发后的页面
<body>
<img src="/file/${filename}">
<a href="/load?filename=${filename}">下载</a>
</body>
请求转发获得图片信息
注意转换了的request只能通过转换后的对象获取
这里发现设置虚拟路径并不会保存到本地,设置物理路径可以保存在本地文件夹,不清楚是什么原理可以在saveAs时选择保存的路径是虚拟还是物理或者自动选择
PS:这里发现图片保存在了war包
下载的实现,页面加入一个a标签请求get到服务器
<body>
<img src="/file/${filename}">
<a href="/load?filename=${filename}">下载</a>
</body>
load的servlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String filename = req.getParameter("filename");
String path = "/file/"+filename;
//设置响应头信息和响应类型
resp.setContentType("application/octet-stream");
//头信息
resp.setHeader("Content-Disposition","attachment;filename="+filename);
req.getRequestDispatcher(path).forward(req,resp);
//刷新缓存区
resp.flushBuffer();
}