`
sammyfun
  • 浏览: 1163477 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

转载 文件上传下载

    博客分类:
  • java
 
阅读更多
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]
       + "&nbsp;&nbsp;&nbsp;");
    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
      + " &nbsp;&nbsp;文件大小: " + 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();
        }
    }
分享到:
评论

相关推荐

    Asp.Net Core 3.1 WebApi 实现前后端分离,实现文件上传下载【02源码】

    分享初衷:最近在做前后端分离项目,用到了文件上传下载功能,找了很多类似的案例,基本上都是相互转载,很少有原创的(总之找了很久没找到合适的),最后没有达到我想要的预期效果,故写此篇博客。 需求背景:以前在...

    ntko 大文件上传控件的文档

    产品文档中可能包含详细的技术指南、API参考、示例代码、故障排除手册等内容,这些都是开发人员理解和使用ntko大文件上传控件的关键资源。通过深入研究这些文档,开发者可以掌握如何配置控件、如何处理各种事件、...

    图片批量上传-转载

    【标题】"图片批量上传-转载"涉及到的主要技术点是基于Web的文件上传功能,特别是针对图片的批量处理。在互联网应用中,用户可能需要一次性上传多张图片,这就需要前端与后端协同实现批量上传的功能。这里提到的工具...

    带进度条的Flash多文件上传面板

    带进度条的Flash多文件上传面板(SwfUploadPanel)(改进版) 这一次的更新是主要是解决了falshplayer10带来的安全性问题还导致不能上传文件. 但也带来一个问题,这个控件并不支持flashpayer8.仅仅支持flashplayer9,10. ...

    免费下载豆丁上的文件

    豆丁网是一个在线文档分享平台,用户可以上传、分享和下载各种类型的文档,包括研究报告、学习资料、课件、简历模板等。然而,部分高级或热门的文档在豆丁网上可能需要付费才能下载。因此,“免费下载豆丁上的文件”...

    三种纯jsp文件上传实例(cos,smartupload,fileupload)

    本人亲自使用cos,smartupload,fileupload做的文件上传得小例子,只用了基本功能,注释非常详细,一看就能学会。测试时请使用图片上传,以便达到最佳效果。转载请注明原作者名,请珍惜他人劳动成果。

    ASP.NET(C#)实现一次性上传多文件

    在做asp.net的Web开发的时候,我们经常会遇到一次性上传多个文件的需求。通常我们的解决方法是固定放多个上传文件框,这样的解决办法显然是不合理的,因为一次上传多个,就意味着数量不确定。 因此我们就要让这些...

    纯HTML5+JS+PHP批量上传

    因为我php也是初学,之前一直出现只上传1个文件的问题。后来发现是由于定义秒为文件名,本地速度过快将前面的函数覆盖了。多亏了php的sleep,才将这个问题解决。 于是这个简单的批量上传组件就这样做好了,欢迎各位...

    FTP上传小工具 方便设计师们开发网络

    需要注意的是,虽然这些工具极大地简化了文件上传流程,但设计师们仍需对网络安全有所了解,确保在使用过程中不会泄露敏感信息,且应遵循正确的版权和引用规则,如描述中提到的“转载请注明出处”。在本例中,...

    word文档自动转html,并通过ftp上传到指定位置,并生成二码码可在线查看(原创请勿转载)

    (原创请勿转载)word文档自动转html,并通过ftp上传到指定位置,并生成二码码可在线查看。 源码是vb.net的

    iOS AFN3.0 下载封装【转载】

    网络层封装,基于AFNetworking 3.0 get请求 post请求 图片上传 文件下载 网络状况检测 HUD显示(使用的MBProgressHUD,不喜欢的可以自己去掉) 【转载自 https://github.com/xinge1/LXNetworking】

    HBuilder+HTML5 Plus+MUI实现拍照或者相册选择图片上传

    Uploader模块管理网络上传任务,用于从本地上传各种文件到服务器,并支持跨域访问操作。通过plus.uploader可获取上传管理对象。Uploader上传使用HTTP的POST方式提交数据,数据格式符合Multipart/form-data规范,即...

    上传局域网内自动升级程序.rar_c/s自动升级_pb 升级_自动 上传 文件_自动升级 c_自动更新

    “自动_上传_文件”可能是指客户端能够自动从服务器下载更新文件;“自动升级_c”可能指的是C语言编写的部分,或者是指C/S模式下的自动升级;“自动更新”则是整个系统的中心目标,即软件能够无需用户手动干预地检查...

    电骡emule搜索和下载国外资源的一点心得转载.pdf

    活跃的分享者,也就是那些经常在线并积极上传文件的用户,他们的资源更容易下载。因此,选择下载活跃用户发布的资源是提升下载成功率的有效方法。 值得注意的是,虽然eMule给我们带来了便利,但使用P2P软件下载版权...

    爱特文件管理器 1.8.0.zip

    爱特文件管理器 1.8.0 更新说明: →加入批量复制功能 →加入全选消选功能 →全格式的解压支持(unix x86) →相信有了本次更新我的全格式解压实现方式及某个我编译的...*转载务必附上本文档,这个要求不过份吧?

    sbupl 纯HTML5+JS批量上传 带PHP示例仅2KB

    之前分享过xxling的HTML5文件上传,但那个程序改起来比较麻烦。 最近学了一下HTML5和JS文件的批量处理,就抽空自己写了个。 代码编写参考了IBM、CSDN、博客园上的部分文章,在此感谢。 文件大小只有2KB,无需flash...

    上传Typora笔记,解决图片无法正常显示的方法所需的工具包

    2. 本地图片路径问题:如果图片存储在本地,当移动或重命名文件后,Typora可能找不到图片的正确路径。 3. 缺少支持的图片上传服务:Typora本身并不提供图片上传功能,需要借助第三方工具或插件。 "PicGo-Setup-...

    Typora 图片上传插件 - 将图片上传到腾讯云对象存储.rar

    对于喜欢写Markdown文档的人来说,Typora无疑是一个写作利器,它有别于其他的Markdown软件,不是一边编辑一边渲染,而是即写即渲染,这样对于浏览md文件也非常友好。此外Typora还支持更换主题,在其官网可以下载到很...

    一次性上传多文件源码ASP.NETC#

    在做asp.net的Web开发的时候,我们经常会遇到一次性上传多个文件的需求。通常我们的解决方法是固定放多个上传文件框,这样的解决办法显然是不合理的,因为一次上传多个,就意味着数量不确定。 因此我们就要让这些...

Global site tag (gtag.js) - Google Analytics