java图片上传下载_java实现文件的上传和下载

1、 servlet 如何实现文件的上传和下载?

1.1上传文件

参考自:http://blog.csdn.net/hzc543806053/article/details/7524491

通过前台选择文件,然后将资源上传到(即新建一个文件)到发布的资源文件下面,

下载就是url 到发布的资源文件,触发即可自动下载。服务器已经封装了如何下载的底层实现。(此处用的是tomcat)

JSP上传文件方法:关于在HTTP request 中通过Post方法提交文件的规范,该项目性能稳定快速,易于部署和使用.本次教程以前端jsp + 后端 servlet的方式,利用JSP上传文件,你也可以完全在jsp中实现而不用servlet.

在开始JSP上传文件之前你要准备以下几个东西:

1. commons-FileUpload 1.3 包

下载地址:http://jakarta.apache.org/commons/fileupload/

2. commons-IO 2.5 包

下载地址:http://jakarta.apache.org/commons/io/

有了上面这些东西我们就可以开始了

1. 新建一个叫Servlet_UploadDownLoad的WEB项目

2. 接着把这两个jar包放到WEB-INF/lib目录中:

00cd7a6f0222e86bfb8915dd4baa0433.png

3.接下来我们要准备一份如下内容的upload.jsp文件,用来选择要上传的文件,

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

Jsp+Servlet upload file

上面文件中有几个需要注意的地方就是

1. action="UploadServlet" 必须和后面的web.xml配置文件中对servlet映射必须保持一致.

2. method="POST" 这里必须为"POST"方式提交不能是"GET".

3.enctype="multipart/form-data"这里是要提交的内容格式,表示你要提交的是数据流,而不是普通的表单文本.

4. file1,file2,file3表示你要3个文件一起上传,你也可以一次只上传一个文件.

接下来我们要写一个与上面这个upload.jsp配套的servlet程序,就叫做UploadServlet.java吧import java.io.File;

import java.io.*;

import java.io.IOException;

import java.io.PrintWriter;

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.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**

*

* @author Administrator 文件上传 具体步骤: 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包 2) 利用

*         request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同 3)对

*         DiskFileItemFactory 对象设置一些 属性 4)高水平的API文件上传处理 ServletFileUpload

*         upload = new ServletFileUpload(factory); 目的是调用

*         parseRequest(request)方法 获得 FileItem 集合list ,

*

*         5)在 FileItem 对象中 获取信息, 遍历, 判断 表单提交过来的信息 是否是 普通文本信息 另做处理 6) 第一种. 用第三方

*         提供的 item.write( new File(path,filename) ); 直接写到磁盘上 第二种. 手动处理

*

*/

public class UploadServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setCharacterEncoding("utf-8"); // 设置编码

// 获得磁盘文件条目工厂

DiskFileItemFactory factory = new DiskFileItemFactory();

// 获取文件需要上传到的路径

String path = request.getRealPath("/uploadFile");

// 如果没以下两行设置的话,上传大的 文件 会占用 很多内存,

// 设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同

/**

* 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem

* 格式的 然后再将其真正写到 对应目录的硬盘上

*/

factory.setRepository(new File(path));

// 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室

factory.setSizeThreshold(1024 * 1024);

// 高水平的API文件上传处理

ServletFileUpload upload = new ServletFileUpload(factory);

try {

// 可以上传多个文件

List list = (List) upload.parseRequest(request);

for (FileItem item : list) {

// 获取表单的属性名字

String name = item.getFieldName();

// 如果获取的 表单信息是普通的 文本 信息

if (item.isFormField()) {

// 获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的

String value = item.getString();

request.setAttribute(name, value);

} else {// 对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些

/**

* 以下三步,主要获取 上传文件的名字

*/

// 获取路径名

String value = item.getName();

// 索引到最后一个反斜杠

int start = value.lastIndexOf("\\");

// 截取 上传文件的 字符串名字,加1是 去掉反斜杠,

String filename = value.substring(start + 1);

request.setAttribute(name, filename);

// 真正写到磁盘上

// 它抛出的异常 用exception 捕捉

// item.write( new File(path,filename) );//第三方提供的

// 手动写的

OutputStream out = new FileOutputStream(new File(path,

filename));

InputStream in = item.getInputStream();

int length = 0;

byte[] buf = new byte[1024];

System.out.println("获取上传文件的总共的容量:" + item.getSize());

// in.read(buf) 每次读到的数据存放在 buf 数组中

while ((length = in.read(buf)) != -1) {

// 在 buf 数组中 取出数据 写到 (输出流)磁盘上

out.write(buf, 0, length);

}

in.close();

out.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值