Java重点之小白解析--浅谈数据流形式图片上载

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

闲话少说,直入主题。先等等这两天做文件上传,都快把宝宝折磨疯了,不会呀,各种查呀,最可悲的是废了老大功夫学会了传送文档的方法,自测的时候特别顺利,图片名,后缀名等等都可以得到了,终于可以跟前端对接了妹的死活接不上,文件上传失败呀,疯了。。。。。于是找原因呀,终于知道,我测试用的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 即可。

问题二。文件名问题。

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

时间: 2024-11-03 22:44:17

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

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

这是一个面试经常遇到的知识点,无论什么公司这个知识点几乎是考小白必备,为什么呢?因为这玩意儿太特么常见了,常见到你写一百行代码,都能用到好几次,不问这个问哪个.so!本小白网罗天下HashMap与HashTable知识重点只是为应对面试官各种神奇提问方式. 最常见的莫过于,问他们的区别了: 其实API中给出了一句相当简短的介绍,在介绍HashMap的一章中,原文是这么说的 [ 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和

java序列化与反序列化以及浅谈一下hadoop的序列化

1.什么是序列化和反序列化 神马是序列化呢,序列化就是把内存中的对象的状态信息,转换成字节序列以便于存储(持久化)和网络传输.(网络传输和硬盘持久化,你没有一定的手段来进行辨别这些字节序列是什么东西,有什么信息,这些字节序列就是垃圾). 反序列化就是将收到字节序列或者是硬盘的持久化数据,转换成内存中的对象. 2.JDK的序列化 JDK的序列化只有实现了serializable接口就能实现序列化与反序列化,但是记得一定要加上序列化版本ID serialVersionUID 这个是识别序列化的之前那

对kotlin和java中的synchronized的浅谈

synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12345678910111213 public class { public void () { for (int i = 0; i < 10; i ++) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStac

Java中Integer和String浅谈

http://qxzxcjq-126-com.iteye.com/blog/883283 Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本数据类型创建的对象,如 int x = 0;这里的x只有值这个属性,没有(或者很少)有其他的方法.这在一些需要对数据进行操作时变的很不方便,程序员需要自己编写很多代码去实现一些常用的功能,增加了工作量及程序的大

Java序列化与对象流浅谈

今晚又重新回顾了Java中序列化与对象流的知识,接触了一位有着上亿行有效代码量的大佬之思想,2333. 1.序列化与反序列化 Java中的序列化简而言之就是为了避免要重复使用的实例在每次执行程序过程中都要重新申请堆空间,序列化后直接加载,节约时间.序列化过程中,保存在文件中的对象只记录了对象的状态(属性),包括成员和类类型(名称),而不会存储对象的方法.可看做将一个有着灵魂的人进行灵魂转移,转移的只是他的记忆,他自己的各种行为,比如吃饭.睡觉--,每个人都拥有,且行为表现一样,即只需转移(保存)

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

在jdk的源码中,存在这样的一些接口,他们不包含任何的(抽象)方法,但是却广泛的存在. 这种接口我们称之为Mark Interface,也就是标记接口. 这些接口呢,我们不用来实现任何的方法,他们的作用就是当某个类实现这个接口的时候,我们就认为这个类拥有了这个接口标记的某种功能了. 下面通过三个例子,分别介绍java中常用的三个标记接口: RandomAccess .Cloneable.java.io.Serializable (1)RandomAccess  在C#中经常会有很多人在争论,在遍

java中的异常处理原理浅谈

什么是异常呢: 在现实生活中,总会有一些问题,聚焦在生活上,我们会有工作问题,比如工作不满意,工作薪水低,工作没有发展前景,那么我们会成为这是一个“问题”. 在java的世界中,那么我们相对应的是程序,那么程序也有这样或者那样的问题,那么我们成为“异常”.异常就是程序在运行时出现的不正常现象. java把异常封装成对象的描述,来高度的概括. java中Error我们无能为力.我们还是聊聊Exception Exception的分类: 1.编译时异常 必须进行捕获 2.运行时异常(也就是Runti

一个两年Java的面试总结,浅谈自己的面试经验

前言16年毕业到现在也近两年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中... 最终有幸去了网易. 但是要特别感谢点我达的领导及HR,真的非常非常好,很感谢他们一直的关照和指导 面试整体事项1.简历要准备好,联系方式一定要正确清晰醒目,项目经历按照时间倒序阐述,注意描述自己在项目中承担的职责,简历的模板尽量选择简洁的,毕竟程序员大部分还是喜欢简单明了的.2.推荐boss直聘,我觉得很好用(不是广告)

浅谈android中图片处理之图形变换特效Matrix(四)

今天,我们就来谈下android中图片的变形的特效,在上讲博客中我们谈到android中图片中的色彩特效来实现的.改变它的颜色主要通过ColorMatrix类来实现. 现在今天所讲的图片变形的特效主要就是通过Matrix类来实现,我们通过上篇博客知道,改变色彩特效,主要是通过ColorMatrxi矩阵的系数,以及每个像素点上所对应的颜色偏移量.而今天的图形变换与那个也是非常的类似.它是一个3*3矩阵,而颜色矩阵则是一个4*5的矩阵.在这个3*3矩阵中则表述出了每个像素点的XY坐标信息.然后通过修