文件上传下载

Posted jxtx92

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传下载相关的知识,希望对你有一定的参考价值。

上传文件方式一:利用SmartUpload进行上传文件

1.导入 jspsmartupload.jar(GBK版) 或 smartupload-utf8.jar (UTF-8)包,form表单 添加 encType="multipart/form-data"   因此表单是以二进制数据发送。
2.创建 SmartUpload 实例 SmartUpload su = new SmartUpload();
3. 初始化上传下载环境 su.initialize(getServletConfig(),request, respone);
4.过滤限制,设置允许上传的后缀名,和不允许的后缀名
  su.setAllowedFilesList("jpg,dmp,gif,jpeg");
  su.setDeniedFilesList("exe,bat,jsp,htm,html,doc,txt,,");
5.准备上传 su.upload();
6.获取上传的文件个数 int count = su.getFiles().getCount();
7.获取上传的文件 com.jspsmart.upload.Files files = su.getFiles();
   对files进行遍历获取单个File对象
  File file = files.getFile(i);
  String fieldName = file.getFieldName();
  String fileName = file.getFileName();
8.复制文件 file.saveAs(destFilePathName,option);
例如:file.saveAs("/upload/"+fileName,su.SAVE_VIRTUAL);
/**
 * destPathName为文件保存目录,option为保存选项,它有三个值,
 * 分别是SAVE_PHYSICAL,SAVE_VIRTUAL和 SAVE_AUTO。
 * SAVE_PHYSICAL指示组件将文件保存到以操作系统根目录为文件根目录的 目录下,
 * SAVE_VIRTUAL指示组件将文件保存到以Web工程根目录为文件根目录的目录下,
 * 而SAVE_AUTO则表示由组件自动选择。
 */ 
9.获取表单的其他内容(注意之前的request获取表单无效)com.jspsmart.upload.Request req = su.getRequest();
 
从以上看出,SmartUpload的代码量不会特别多,比较方便。
 
上传方式二:利用apache 的 commons-fileupload进行上传文件。
 
1.导入jar包,commons-fileupload-1.2.2.jar,commons-io-xxx.jar, form表单 添加 encType="multipart/form-data"
2.判断form表单是否 encType="multipart/form-data"
  ServletFileUpload.isMultipartContent(request)
3.创建临时文件夹和要保存的文件夹,比如工程根目录下 temp和 upload
4.创建硬盘文件工厂类 DiskFileItemFactory factory = new DiskFileItemFactory();
5.指定上传文件的临时目录 factory.setRepository(new java.io.File(tem));
6.指定在内存中缓存数据大小,以byte为单位 factory.setSizeThreshold(1024*1024*1); 
7.创建文件上传类 ServletFileUpload upload = new ServletFileUpload(factory);
8.设置单个上传文件的最大长度 upload.setFileSizeMax(1024*1024*150);
9.设置上传多个文件的总长度 upload.setSizeMax(1024*1024*200);
10.获取到form表单中的元素 List<FileItem>  list = upload.parseRequest(request);
11.判断FileItem的类型,file.isFormField() true:表示普通类型,false 为上传文件类型
   file.getName() 获取文件名,
   file.getSize() 获取文件大小
12.写入目标文件, file.write(target);
 
文件下载
   1.初始化环境
     SmartUpload su = new SmartUpload();
   2.执行上传下载的初始化工作,必须第一个执行
     su.initialize(getServletConfig(),request, respone);
   3.设置下载文件
     su.downloadFile("F:\\workcell\\AsaFood\\AsAFood_src\\AsAFood(包结构文档).xls");
 
文件上传具体实现
1,JSP页面
 
<center>   

    <h1>文件上传</h1>   

    <form name="uploadform"method="post" action="adddata" ENCTYPE="multipart/form-data">   

        <table border="1"width="450"cellpadding="4" cellspacing="2"bordercolor="#9BD7FF">   

            <tr><td width="100%"colspan="2">   

                    文件:<input name="file1"size="40"type="file">   

            </td></tr>   

        </table>   

        <table>   

            <tr><td align="center"><input name="upload" type="submit"value="上传"/></td></tr>   

        </table>   

    </form>   

</center> 

要实现文件上传,在form标签内必须包含 ENCTYPE="multipart/form-data" 才可以实现(RFC1867协议:http://www.faqs.org/rfcs/rfc1867.html),且必须以 POST 方式上传。

 
2,web.xml 配置
 
<servlet> 

    <servlet-name>AddDataServlet</servlet-name> 

    <servlet-class>kxjh.AddDataServlet</servlet-class> 

</servlet> 

<servlet-mapping> 

    <servlet-name>AddDataServlet</servlet-name> 

    <url-pattern>/adddata</url-pattern> 

</servlet-mapping> 

3,Servelt 实现(commons-fileupload-1.2.1、commons-io-1.4)

 
// 解析 request,判断是否有上传文件   

boolean isMultipart = ServletFileUpload.isMultipartContent(request);   

if (isMultipart) {   

    // 创建磁盘工厂,利用构造器实现内存数据储存量和临时储存路径   

     DiskFileItemFactory factory = new DiskFileItemFactory(1024 * 4, new File("D:\\Temp"));   

    // 设置最多只允许在内存中存储的数据,单位:字节   

    // factory.setSizeThreshold(4096);   

    // 设置文件临时存储路径   

    // factory.setRepository(new File("D:\\Temp"));   

    // 产生一新的文件上传处理程式   

     ServletFileUpload upload = new ServletFileUpload(factory);   

     // 设置路径、文件名的字符集   

    upload.setHeaderEncoding("UTF-8");   

    // 设置允许用户上传文件大小,单位:字节   

    upload.setSizeMax(1024 * 1024 * 100);   

    // 解析请求,开始读取数据   

    // Iterator<FileItem> iter = (Iterator<FileItem>) upload.getItemIterator(request);   

    // 得到所有的表单域,它们目前都被当作FileItem   

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

    // 依次处理请求   

     Iterator<FileItem> iter = fileItems.iterator();   

    while (iter.hasNext()) {   

        FileItem item = (FileItem) iter.next();   

        if (item.isFormField()) {   

            // 如果item是正常的表单域   

            String name = item.getFieldName();   

            String value = item.getString("UTF-8");   

            System.out.println("表单域名为:"+name+"表单域值为:"+value);   

        } else {   

            // 如果item是文件上传表单域   

            // 获得文件名及路径   

            String fileName = item.getName();   

            if (fileName != null) {   

                // 如果文件存在则上传   

                File fullFile = new File(item.getName());   

                if (fullFile.exists()) {   

                    File fileOnServer = new File("D:\\My Documents\\" + fullFile.getName());   

                    item.write(fileOnServer);   

                    System.out.println("文件" + fileOnServer.getName() + "上传成功");   

                }   

            }   

        }   

    }   

} 

利用ccommons-fileupload-1.2.1实现上传,其实现必须包含commons-io-1.4,以上为实现上传文件所使用的方法和所用到包的版本。

 

总结:以正常实现文件上传功能,在实现过程中如果form未配置 ENCTYPE="multipart/form-data" 元素,
则上传文件为本地的绝对路径,而非正常的文件。
详细使用参考api文档。

以上是关于文件上传下载的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 文件上传出现错误“JSON 文本未以数组或对象开头,并且允许未设置片段的选项”

使用 libtorrent 下载特定片段

根据图片的url地址下载图片到本地保存代码片段

Xamarin Android 片段库

将存储在内存中的文件上传到s3

片段中的Firebase数据不是持久的,会重新下载