文档上载,上载也不知道哪个大神(混球)起的名字,读起来怪怪的,反正平时我只读上传。

闲话少说,直入主题。先等等这两天做文件上传,都快把宝宝折磨疯了,不会呀,各种查呀,最可悲的是废了老大功夫学会了传送文档的方法,自测的时候特别顺利,图片名,后缀名等等都可以得到了,终于可以跟前端对接了妹的死活接不上,文件上传失败呀,疯了。。。。。于是找原因呀,终于知道,我测试用的form 表单,前端用的数据流,哎,改吧,命苦不能怪政府,谁让人家是资深工程师,我是小白呢,人家随便说句话我就掉坑里了,改吧,人家忙,没空。妥妥的改。

废话说了好多,重点内容与以上吐槽无关。请往下看

/**
  * @throws IOException
  *
 * @category 上传文档
 * @Title: uploadImage
 * @Description:
 * @return void    返回类型
 * @throws
  */
 protected int uploadFile(HttpServletRequest request, HttpServletResponse response, String saveFilename) {
  int size = 1024 * 1024 * 2;
  try {
   // 上传时生成的文件保存目录
   String realSavePath = sp.makePath(saveFilename, sp.getFileSaveRootPath());
   // 上传时生成的临时文件保存目录
   String tempPath = this.getServletContext().getRealPath(sp.getTemp_Path());
   File tmpFile = new File(tempPath);
   if (!tmpFile.exists()) {
    // 创建临时目录当前已处理
    tmpFile.mkdir();
   }
   
   //sp.makePath(savePath);
   
   InputStream in = new BufferedInputStream(new DataInputStream(request.getInputStream()), size);
   OutputStream out = new BufferedOutputStream(new FileOutputStream(realSavePath ), size);
   byte buffer[] = new byte[1024];
   // 判断输入流中的数据是否已经读完的标识
   int len = 0;
   // 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
   while ((len = in.read(buffer)) > 0) {
    // 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\"
    // +filename)当
     
    out.write(buffer, 0, len);
   }
   // 关闭输入流
   in.close();
   // 关闭输出流
   out.close();

return 1;

} catch (IOException e) {
   System.out.println("io操作异常");
   e.printStackTrace();
   return 0;
  }

}

注:

saveFilename      :是文件名,用于存储到数据库中,便于索引文件。

sp.getFileSaveRootPath():是文件存储地址,存储地址这块遇到一些问题下面会提到。

sp.getTemp_Path())   :当文件过大时,缓存路径。

文件上传时遇到了几个问题以及解决的办法:

问题一:文件地址存储问题。

其一 以存储到相对路径中,一般都是这么搞,所谓相对路径,在这里一般是相对系统的发布路径,也就是说,如果是web项目,tomcat/ebapp文件夹,这目录下会相对存在一个与项目同名的文件夹, 存放项目发布后的资源,上传文档的路径也是以此为根目录的,但是也有人认为是以Root为根目录,对此不太明白,望各位走过路过的大神稍微指点指点。

在这里会遇到一个问题:就是每次重新编译项目,就会出现原来上传的资源消失了的现象,其实这是必然的现象,因为说是更新,其实仔细查看Tomcat的启动流程就会发现,它是先删除原来编译的项目文件,然后再重新编译现在的文件,会出现资源的消失也是必然的。由此引出了下面的解决思路。

其二 可以存储到盘中的任意路径中,这就需要用到Tomcat的一个虚拟存储技术。

所谓虚拟存储,是指将Tomcat下一个虚拟路径,映射到磁盘中的实际路径中去。

实现方式一般有两种,

方式一 tomcat安装目录下conf/servlet.xml中 <HOST>标签下配置

<Context path="/demo" docBase="E:\demo" />

方式二 在conf\Catalina\localhost中添加文件名为test.xml

内容为 <?xml version="1.0" encoding="UTF-8"?>
<Context crossContext="true" docBase="D:\SavePhotos"  reloadable="true"/>

即可实现文件的上传。这是项目部署之后的实现方式

如果项目还在本地,一般都会有项目名,那么只需修改文件名为   文件名#test.xml 即可。

问题二。文件名问题。

问题三。文件名后缀问题。

Java重点之小白解析--浅谈数据流形式图片上载的更多相关文章

  1. Java重点之小白解析--浅谈HashMap与HashTable

    这是一个面试经常遇到的知识点,无论什么公司这个知识点几乎是考小白必备,为什么呢?因为这玩意儿太特么常见了,常见到你写一百行代码,都能用到好几次,不问这个问哪个.so!本小白网罗天下HashMap与Ha ...

  2. 对kotlin和java中的synchronized的浅谈

    synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12 ...

  3. Java中Integer和String浅谈

    Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本 ...

  4. Java中的SPI原理浅谈

    在面向对象的程序设计中,模块之间交互采用接口编程,通常情况下调用方不需要知道被调用方的内部实现细节,因为一旦涉及到了具体实现,如果需要换一种实现就需要修改代码,这违反了程序设计的"开闭原则& ...

  5. 【Java心得总结二】浅谈Java中的异常

    作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...

  6. 为什么这些java接口没有抽象方法?浅谈Java标记接口

    在jdk的源码中,存在这样的一些接口,他们不包含任何的(抽象)方法,但是却广泛的存在. 这种接口我们称之为Mark Interface,也就是标记接口. 这些接口呢,我们不用来实现任何的方法,他们的作 ...

  7. Java中常用修饰符浅谈

    一.public.protected.default和private修饰符的作用域 public:在java程序中,如果将属性和方法定义为 public 类型,那么此属性和方法所在的类和及其子类,同一 ...

  8. Java中的容器 I————浅谈Queue和PriorityQueue

    一.Queue的实现 通过LinkedList类实现Queue接口来完成对Queue的实例类的实现,代码如下: Queue<Integer> queue=new LinkedList< ...

  9. Java中的容器 I————浅谈List

    一.List接口的继承关系 List接口是Collection接口的子接口,而ArrayList和LinkedList以及Vector是其实现类. List的特点是可以将元素维护在特定的序列中,可以再 ...

随机推荐

  1. 洛谷P3370 【模板】字符串哈希

    P3370 [模板]字符串哈希 143通过 483提交 题目提供者HansBug 标签 难度普及- 提交  讨论  题解 最新讨论 看不出来,这题哪里是哈希了- 题目描述 如题,给定N个字符串(第i个 ...

  2. c#查找string数组的某一个值的索引

    string[] array = { "A","B","C","D","H"};   var ind ...

  3. 织梦系统“当前位置”{dede:field.position}的修改方法

    dedecms中修改当前位置{dede:field.position},就是只要首页>一级栏目>二级栏目这样.找到include/typelink.class.php,找到这个文件里的这个 ...

  4. windows脚本配置ip地址

    背景:工作上经常涉及到要调试设备,每次都要手动配置静态ip地址,配置完之后还要重新改回来,有时候为了连续调试多台设备,来回手动更改ip,实在麻烦. 思考:想到windows有脚本,可以利用脚本文件达到 ...

  5. nodejs+express+jade配置

    安装步骤 一.首先可跟着这个网址安装http://jingyan.baidu.com/article/91f5db1b2bb6941c7f05e33c.html,路径可由自己定. 二.同时参考http ...

  6. VMWare MAC系统调整磁盘

    VMware,打开虚拟文件,调整磁盘大小. 从40G调整到80G 进入虚拟机,打开终端 diskutil list;diskutil resizeVolume disk0s2 80GB http:// ...

  7. python容器类型:列表,字典,集合等

    容器的概念我是从C++的STL中学到的 什么是容器? 容器是用来存储和组织其他对象的对象. 也就是说容器里面可以放很多东西,这些东西可以是字符串,可以是整数,可以是自定义类型,然后把这些东西有组织的存 ...

  8. 利用循环播放dataurl的视频来防止锁屏:NoSleep.js

    mark下. 地址:http://www.open-open.com/lib/view/open1430796889882.html

  9. 珍惜每一滴水(kbmmw 中的内存调试)

    作为一个服务器端的应用,最基本的要求就是稳定,当然要做一个稳定的服务器端,需要涉及到很多方面, 内存泄露就是稳定的一个致命杀手,因为服务器的物理内存是有限的,即使一个功能有很小的内存泄露,经过 长时间 ...

  10. .net如何向csv添加一列

    using System;using System.Collections.Generic;using System.Drawing;using System.Globalization;using ...