web.xml 更新为:
web.xml<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>FileUploadServlet</servlet-name>
<servlet-class>FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileUploadServlet</servlet-name>
<url-pattern>/FileUploadServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>upload.html</welcome-file>
</welcome-file-list>
</web-app>
其中,我把<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> 的欢迎文件设为了upload.html,
这样等完成后可能直接用http://localhost:8080/FileUpload/ 来访问upload.html. 不改的话, 可以在http://localhost:8080/FileUpload/upload.html
页面上传文件. 在写FileUploadServlet 之前, 先将之前下载的commons-fileupload 和commons-io 组件包压缩文件解压出来, 把里面的
commons-fileupload-1.2.jar (lib文件夹下) 和 commons-io-1.3.2.jar 拷到WebRoot/WEB-INF/lib 文件夹下, 以便使用它们的功能.
FileUploadServlet.java 的源代码如下, 附有详细注解:
FileUploadServlet.java import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
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.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadServlet extends HttpServlet {
public FileUploadServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
final long MAX_SIZE = 3 * 1024 * 1024;// 设置上传文件最大为 3M
// 允许上传的文件格式的列表
final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt",
"doc", "docx", "mp3", "wma", "m4a" };
response.setContentType("text/html");
// 设置字符编码为UTF-8, 这样支持汉字显示
response.setCharacterEncoding("UTF-8");
// 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
DiskFileItemFactory dfif = new DiskFileItemFactory();
dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
dfif.setRepository(new File(request.getRealPath("/")
+ "ImagesUploadTemp"));// 设置存放临时文件的目录,web根目录下的ImagesUploadTemp目录
// 用以上工厂实例化上传组件
ServletFileUpload sfu = new ServletFileUpload(dfif);
// 设置最大上传尺寸
sfu.setSizeMax(MAX_SIZE);
PrintWriter out = response.getWriter();
// 从request得到 所有 上传域的列表
List fileList = null;
try {
fileList = sfu.parseRequest(request);
} catch (FileUploadException e) {// 处理文件尺寸过大异常
if (e instanceof SizeLimitExceededException) {
out.println("文件尺寸超过规定大小:" + MAX_SIZE + "字节<p />");
out.println("<a href=/"upload.html/" target=/"_top/">返回</a>");
return;
}
e.printStackTrace();
}
// 没有文件上传
if (fileList == null || fileList.size() == 0) {
out.println("请选择上传文件<p />");
out.println("<a href=/"upload.html/" target=/"_top/">返回</a>");
return;
}
// 得到所有上传的文件
Iterator fileItr = fileList.iterator();
// 循环处理所有文件
while (fileItr.hasNext()) {
FileItem fileItem = null;
String path = null;
long size = 0;
// 得到当前文件
fileItem = (FileItem) fileItr.next();
// 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
if (fileItem == null || fileItem.isFormField()) {
continue;
}
// 得到文件的完整路径
path = fileItem.getName();
// 得到文件的大小
size = fileItem.getSize();
if ("".equals(path) || size == 0) {
out.println("请选择上传文件<p />");
out.println("<a href=/"upload.html/" target=/"_top/">返回</a>");
return;
}
// 得到去除路径的文件名
String t_name = path.substring(path.lastIndexOf("//") + 1);
// 得到文件的扩展名(无扩展名时将得到全名)
String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);
// 拒绝接受规定文件格式之外的文件类型
int allowFlag = 0;
int allowedExtCount = allowedExt.length;
for (; allowFlag < allowedExtCount; allowFlag++) {
if (allowedExt[allowFlag].equals(t_ext))
break;
}
if (allowFlag == allowedExtCount) {
out.println("请上传以下类型的文件<p />");
for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++)
out.println("*." + allowedExt[allowFlag]
+ " ");
out.println("<p /><a href=/"upload.html/" target=/"_top/">返回</a>");
return;
}
long now = System.currentTimeMillis();
// 根据系统时间生成上传后保存的文件名
String prefix = String.valueOf(now);
// 保存的最终文件完整路径,保存在web根目录下的ImagesUploaded目录下
String u_name = request.getRealPath("/") + "ImagesUploaded/"
+ prefix + "." + t_ext;
try {
// 保存文件
fileItem.write(new File(u_name));
out.println("文件上传成功. 已保存为: " + prefix + "." + t_ext
+ " 文件大小: " + size + "字节<p />");
out.println("<a href=/"upload.html/" target=/"_top/">继续上传</a>");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void init() throws ServletException {
// Put your code here
}
}
保存后部署项目(MyEclipse下直接点击Deploy J2EE...按钮, 然后选择Tomcat服务器). 没有MyEclipse的话, 把WebRoot 拷到
Tomcat 主目录下的webapps 目录下, 并重命名为 FileUpload 然后启动Tomcat. (或直接下载我在文章开始提供的工程打包rar文件).
最后打开浏览器, 输入url:
public HttpServletResponse download(String path, HttpServletResponse response) {
try {
// path是指欲下载的文件的路径。
File file = new File(path);
// 取得文件名。
String filename = file.getName();
// 取得文件的后缀名。
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return response;
}
public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {
// 下载本地文件
String fileName = "Operator.doc".toString(); // 文件的默认保存名
// 读到流中
InputStream inStream = new FileInputStream("c:/Operator.doc");// 文件的存放路径
// 设置输出的格式
response.reset();
response.setContentType("bin");
response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
// 循环取出流中的数据
byte[] b = new byte[100];
int len;
try {
while ((len = inStream.read(b)) > 0)
response.getOutputStream().write(b, 0, len);
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void downloadNet(HttpServletResponse response) throws MalformedURLException {
// 下载网络文件
int bytesum = 0;
int byteread = 0;
URL url = new URL("windine.blogdriver.com/logo.gif");
try {
URLConnection conn = url.openConnection();
InputStream inStream = conn.getInputStream();
FileOutputStream fs = new FileOutputStream("c:/abc.gif");
byte[] buffer = new byte[1204];
int length;
while ((byteread = inStream.read(buffer)) != -1) {
bytesum += byteread;
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
分享到:
相关推荐
分享初衷:最近在做前后端分离项目,用到了文件上传下载功能,找了很多类似的案例,基本上都是相互转载,很少有原创的(总之找了很久没找到合适的),最后没有达到我想要的预期效果,故写此篇博客。 需求背景:以前在...
产品文档中可能包含详细的技术指南、API参考、示例代码、故障排除手册等内容,这些都是开发人员理解和使用ntko大文件上传控件的关键资源。通过深入研究这些文档,开发者可以掌握如何配置控件、如何处理各种事件、...
【标题】"图片批量上传-转载"涉及到的主要技术点是基于Web的文件上传功能,特别是针对图片的批量处理。在互联网应用中,用户可能需要一次性上传多张图片,这就需要前端与后端协同实现批量上传的功能。这里提到的工具...
带进度条的Flash多文件上传面板(SwfUploadPanel)(改进版) 这一次的更新是主要是解决了falshplayer10带来的安全性问题还导致不能上传文件. 但也带来一个问题,这个控件并不支持flashpayer8.仅仅支持flashplayer9,10. ...
豆丁网是一个在线文档分享平台,用户可以上传、分享和下载各种类型的文档,包括研究报告、学习资料、课件、简历模板等。然而,部分高级或热门的文档在豆丁网上可能需要付费才能下载。因此,“免费下载豆丁上的文件”...
本人亲自使用cos,smartupload,fileupload做的文件上传得小例子,只用了基本功能,注释非常详细,一看就能学会。测试时请使用图片上传,以便达到最佳效果。转载请注明原作者名,请珍惜他人劳动成果。
在做asp.net的Web开发的时候,我们经常会遇到一次性上传多个文件的需求。通常我们的解决方法是固定放多个上传文件框,这样的解决办法显然是不合理的,因为一次上传多个,就意味着数量不确定。 因此我们就要让这些...
因为我php也是初学,之前一直出现只上传1个文件的问题。后来发现是由于定义秒为文件名,本地速度过快将前面的函数覆盖了。多亏了php的sleep,才将这个问题解决。 于是这个简单的批量上传组件就这样做好了,欢迎各位...
需要注意的是,虽然这些工具极大地简化了文件上传流程,但设计师们仍需对网络安全有所了解,确保在使用过程中不会泄露敏感信息,且应遵循正确的版权和引用规则,如描述中提到的“转载请注明出处”。在本例中,...
(原创请勿转载)word文档自动转html,并通过ftp上传到指定位置,并生成二码码可在线查看。 源码是vb.net的
网络层封装,基于AFNetworking 3.0 get请求 post请求 图片上传 文件下载 网络状况检测 HUD显示(使用的MBProgressHUD,不喜欢的可以自己去掉) 【转载自 https://github.com/xinge1/LXNetworking】
Uploader模块管理网络上传任务,用于从本地上传各种文件到服务器,并支持跨域访问操作。通过plus.uploader可获取上传管理对象。Uploader上传使用HTTP的POST方式提交数据,数据格式符合Multipart/form-data规范,即...
“自动_上传_文件”可能是指客户端能够自动从服务器下载更新文件;“自动升级_c”可能指的是C语言编写的部分,或者是指C/S模式下的自动升级;“自动更新”则是整个系统的中心目标,即软件能够无需用户手动干预地检查...
活跃的分享者,也就是那些经常在线并积极上传文件的用户,他们的资源更容易下载。因此,选择下载活跃用户发布的资源是提升下载成功率的有效方法。 值得注意的是,虽然eMule给我们带来了便利,但使用P2P软件下载版权...
爱特文件管理器 1.8.0 更新说明: →加入批量复制功能 →加入全选消选功能 →全格式的解压支持(unix x86) →相信有了本次更新我的全格式解压实现方式及某个我编译的...*转载务必附上本文档,这个要求不过份吧?
之前分享过xxling的HTML5文件上传,但那个程序改起来比较麻烦。 最近学了一下HTML5和JS文件的批量处理,就抽空自己写了个。 代码编写参考了IBM、CSDN、博客园上的部分文章,在此感谢。 文件大小只有2KB,无需flash...
2. 本地图片路径问题:如果图片存储在本地,当移动或重命名文件后,Typora可能找不到图片的正确路径。 3. 缺少支持的图片上传服务:Typora本身并不提供图片上传功能,需要借助第三方工具或插件。 "PicGo-Setup-...
对于喜欢写Markdown文档的人来说,Typora无疑是一个写作利器,它有别于其他的Markdown软件,不是一边编辑一边渲染,而是即写即渲染,这样对于浏览md文件也非常友好。此外Typora还支持更换主题,在其官网可以下载到很...
在做asp.net的Web开发的时候,我们经常会遇到一次性上传多个文件的需求。通常我们的解决方法是固定放多个上传文件框,这样的解决办法显然是不合理的,因为一次上传多个,就意味着数量不确定。 因此我们就要让这些...