jsp 用户上传头像、上传图片、邮件上传附件代码

jsp教程 用户上传头像、上传图片、邮件上传附件代码

2. 页面表单的实现
    文件上传表单和普通表单有两个区别

    1) 需要文件上传字段  <input type=”file” />

    2) form 表单的 enctype 属性需要指定为 multipart/form-data

3. 服务器端解析request
    在 Servlet 中通过 request.getInputStream 获得表单上传数据,会发现数据是分段发送的

由于自己写程序解析有难度,我们可以使用Apache 开发的开源组件Commons-fileupload

需要导入 jar 包Commons-fileupload 和Commons-io

4 . UploadServlet 中处理文件上传程序
// 1. 创建工厂类

DiskFileItemFactory factory = new DiskFileItemFactory();

// 2. 创建FileUpload对象

ServletFileUpload upload = new ServletFileUpload(factory);

// 3. 判断是否是上传表单

boolean b = upload.isMultipartContent(request);

if(!b) {

    // 不是文件上传

request.setAttribute("message", "对不起,不是文件上传表单!");

request.getRequestDispatcher("/message.jsp").forward(request, response);

    return;

}

// 是文件上传表单

// 4. 解析request,获得FileItem项

List<FileItem> fileitems = upload.parseRequest(request);

// 5. 遍历集合

for(FileItem item : fileitems) {

    // 判断是不是普通字段

if(item.isFormField()) {

    String name = item.getFieldName();

    String value = item.getString();

    // 手工的转换了

    value = new String(value.getBytes("iso-8859-1"),"utf-8");

    System.out.println(name + "=" + value);

} else {

    // 文件上传字段

    // 获得文件名

    String filename = item.getName();

    System.out.println(filename);

    filename = filename.substring(filename.lastIndexOf("")+1);

   

    System.out.println(filename);

    // 创建文件

    ServletContext context = getServletContext();

    String dir = context.getRealPath("WEN-INF/upload");

    File file = new File(dir, filename);

    file.createNewFile();

   

    // 获得流,读取数据写入文件

    InputStream in = item.getInputStream();

    FileOutputStream fos = new FileOutputStream(file);

   

    int len;

    byte[] buffer = new byte[1024];

    while((len=in.read(buffer))>0)

       fos.write(buffer,0,len);

    fos.close();

    in.close();

    item.delete();    // 删除临时文件

}

二、 文件上传处理细节
1. 中文乱码问题
    1) 文件名中文乱码问题,解决办法: 告诉文件上传组件以什么编码方式来解码文件名

       ServletUpload.setCharacterEncoding(“utf-8”);

       request. setCharacterEncoding(“utf-8”);

    

    2) 普通字段中文乱码问题

       fileitem.getString(“utf-8”);      

2.   临时文件
    对于大文件不能缓存在内存,需要缓存到硬盘,为了方便管理,我们需要设置临时文件存放目录

    // 设置临时文件的存放位置

factory.setRepository(new File("d:/temp"));

    文件上传完毕需要删除临时文件,否则会导致服务器存在两份上传文件

// 注意,需要先将流进行关闭,否则会导致临时文件无法删除

out.close();

in.close();

// 删除临时文件

fileitem.delete();

3. 文件存放目录
    1) 目录需要隐藏,禁止外界直接访问

    2) 文件名需要保证不重复

    3) 文件应该分目录存放

三、上传进度条
1. 实现进度监听
    需要实现对文件上传进度的监听,需要给FileUpload 对象添加 ProgressListener

    在upload方法中对与进度相关的数据进行处理

    upload.setProgressListener(new ProgressListener() {

    long num = 0;

    public void update(long bytesRead, long contentLength, int items) {

      

            long progress = bytesRead*100/contentLength;

           if(progress==num)

               return;

           num = progress;

           System.out.println("上传进度:" + progress + "%");

      

        //  request.getSession().setAttribute("progress", progress);

        }

    });

2. 在 jsp 页面显示进度
    实验: 

    1) 使用 iframe 发送请求, 请求一个Servlet, 在Servlet 中返回响应,发送自增的num

       此时会发现 iframe 会不停第想Servlet发送请求

    2) 点击文件上传按钮后,iframe立刻停止刷新,直至上传完毕页面跳转至新页面

    3)为了观察实验结果,将form 的 target 指定为 iframe, UploadServlet回送上传完毕的结果

    4) 出现上述问题的原因,浏览器不支持多线程同时访问服务器只能同时发送一个请求,

       这样的访问方式为同步访问

    5) 要在文件上传的同时在iframe中实现进度访问,就需要ie浏览器与服务器进行异步交互

       此时就需要 XMLHttpRequest 对象

       在网页特效中可以直接使用XMLHttpRequest 对象与服务器进行异步通信

       获得XmlHttpRequest 对象的方式有两种

       ie7以上版本

       var xhr = null;

       if(window.XMLHttpRequest)

           xhr = new XMLHttpRequest();

       ie7以下版本

       if(window.ActiveXObject)

           xhr = new ActiveXObject(“Microsoft.XMLHTTP”);

      

       获得对象后需要调用open方法输入请求地址

       注意请求方式, 地址的输入, 并且需要设置为true 指定异步访问该地址

       xhr.open(“get”,”/upload/servlet/UploadServlet”, false)

      

       // 调用send 方法发送请求,post方式需要发送消息体,get方式则不用直接传入null值

       xhr.send(null);

      

       // 访问 responseText 属性获得 Servlet 回送的数据

       document.write(xhr.responseText);

四、 api方法
1. DiskFileItemFactory 对象
    设置缓冲区大小,字节为单位,默认为10K,一般不用修改

    factory.setSizeThreshold(1000);

    设置临时文件存放目录

    factory.setRepository(file);

2. ServletFileUpload 对象
    判断是否为文件上传表单

    boolean b = upload.isMultipartContent(request);

   解析request对象

   List<FileItem> list = upload.parseRequest(request);

   设置上传文件的最大值

    setFileSizeMax(long fileSizeMax)

    设置上传文件总量的最大值

    setSizeMax(long sizeMax)

    设置编码格式

    setHeaderEncoding(java.lang.String encoding)

    注册进度监听器

    setProgressListener(ProgressListener pListener)

3. FileItem 对象
    获得表单字段的属性名

    item.getFieldName();

    获得普通字段的值

    item.getString(charsetName)

    获得文件上传字段的文件名

    item.getName()

    获得文件上传的流

    item.getInputStream()

  

 文件上传时需要注意的问题:

1.如何设置上传文件最大值,并实现超出最大值时给用户一个友好提示
 upload.setFileSizeMax(1024*10);  //设置最大值
 实现超出最大值时给用户一个友好提示:在程序中捕获FileUploadBase.FileSizeLimitExceededException
 只要程序抛出这个异常,代表用户上传的文件超出最大值
 
 
2.上传过程中的乱码问题
 2.1 普通输入项的乱码
  item.getString("码表 ")
 2.2 上传文件名的乱码
  ServletFileUpload.setHeaderEncoding("码表")
 
3.上传文件的安全性问题
 为防止用户直接上传文件,危害服务器安全,程序应禁止用户直接访问上传文件(即把上传文件保存在用户无法直接访问的目录)
 
4.防止文件覆盖(UUID)

5.文件打散存储(一个目录下面不能存超出1000个文件)
 用hash算法生成目录保存
 
6.设置监听器,监听文件上传进度

 upload.setProgressListener(new ProgressListener(){
   public void update(long arg0, long arg1, int arg2) {
    System.out.println("当前已上传" + arg0 + ",当前处理的文件总大小" + arg1);
   }
  });

7.临时文件的删除问题
 处理完每一个文件上传后,一定要记得调用Fileitem.delete方法,删除临时文件
 
8.限定上传文件类型
 判断上传文件后缀名

 

时间: 2024-09-18 20:57:00

jsp 用户上传头像、上传图片、邮件上传附件代码的相关文章

移动端手机上传头像js

问题描述 移动端手机上传头像js 可以上传图像 裁剪 用js jquery php 技术实现 图像可以预览 解决方案 http://www.58player.com/blog-2327-96084.html 解决方案二: 如何把自己的QQ头像变成透明

实现Asp.net mvc上传头像加剪裁功能_实用技巧

在我们使用QQ上传头像,注册用户账号时是不是都会遇到上传图像,并根据自己的要求对图像进行裁剪,这是怎么实现的呐? 本文主要介绍了Asp.net mvc实现上传头像加剪裁功能,分享给大家供大家参考.具体如下:  运行效果截图如下: 具体代码如下: 前台代码 <link href="~/Content/fineuploader.css" rel="stylesheet" /> <link href="~/Content/jquery.Jcro

手机app-php如何实现将用户设置的头像上传到服务器上的指定位置中保存

问题描述 php如何实现将用户设置的头像上传到服务器上的指定位置中保存 如题,用户在手机客户端设置的,客户端该怎样传,php又该怎样接收,然后存到服务器中的某个位置,并把该位置的url存入数据库中 解决方案 用户上传头像时,使用move_uploaded_file将头像保存到你自己指定的位置就好.之后,把你指定的路径+图片名存到数据库的指定字段中就好.可以看看php的文件上传

java web问题,用户上传头像,我应该存在哪里?

问题描述 java web问题,用户上传头像,我应该存在哪里? 一般存在哪里?,存在服务器上,我重新发布就没啦.一般存在哪里?,存在服务器上,我重新发布就没啦 解决方案 开一个叫upload的文件夹,存在里面.部署的时候不要删除原先的应用. 解决方案二: 上传到一个目录可以就放在当前工程下面.

上传图片-jsp中怎么实现多个plupload上传

问题描述 jsp中怎么实现多个plupload上传 在jsp的表格中有多个产品,每个产品都需要上传图片,如何在一个jsp中实现多个plupload

html5-请问,JSP网页中如何实现头像上传的功能。实现效果:一般现在网站可以上传头像,可以旋转和剪裁,预览。

问题描述 请问,JSP网页中如何实现头像上传的功能.实现效果:一般现在网站可以上传头像,可以旋转和剪裁,预览. jsp网页实现头像上传功能.实现效果,可以剪切,旋转,预览.网站用的SpringMVC框架.现在html5或者jar包,有实现的吗?求一个示例,谢谢~ 解决方案 如何实现网站应用中的头像剪裁和上传

JavaScript实现仿flash上传头像

flash上传头像多不胜举了,可JS仿flash的见的不多,也是工作需要,就试着写写看!不料,设想还真的可行 先看效果图(在FF下): 下面是我整个的思路: 一.用ajaxFileUpload.js异步上传图片.这个不用多说了,挺简单的东西. 二.div拖拽用jquery-ui.这个也不多说了. 三.上传过图片的处理. 编辑容器是300*300,如果图片不在300*300之内,这里会生成一个maxHeight=300,maxWidth=300的缩略图, 用于设置编辑容器的背景,如果原文件为123

JS仿flash上传头像效果实现代码_javascript技巧

先看效果图(在FF下): 下面是我整个的思路: 一.用ajaxFileUpload.js异步上传图片.这个不用多说了,挺简单的东西. 二.div拖拽用jquery-ui.这个也不多说了. 三.上传过图片的处理. 编辑容器是300*300,如果图片不在300*300之内,这里会生成一个maxHeight=300,maxWidth=300的缩略图, 用于设置编辑容器的背景,如果原文件为123.jpg,这里生成的文件为123.jpg.view.jpg,当然,文件123.jpg.view.jpg可能不会

JS上传头像,仿flash 在线头像切图效果

flash上传头像多不胜举了,可JS仿flash的见的不多,也是工作需要,就试着写写看!不料,设想还真的可行 先看两个效果图(在FF下): 1,选择上传图片区域 2,上传后图片到img标签   下面是我整个的思路: 一.用ajaxFileUpload.js异步上传图片.这个不用多说了,挺简单的东西.   二.div拖拽用jquery-ui.这个也不多说了.   三.上传过图片的处理. 编辑容器是300*300,如果图片不在300*300之内,这里会生成一个maxHeight=300,maxWid