The Field File Exceeds Its Maximum Permitted Size of 1048576 Bytes

SpringBoot做文件上传时出现了The field file exceeds its maximum permitted size of 1048576 bytes.错误,显示文件的大小超出了允许的范围。查看了官方文档,原来Spring Boot工程嵌入的tomcat限制了请求的文件大小,这一点在Spring Boot的官方文档中有说明,原文如下

65.5 Handling Multipart File Uploads
Spring Boot embraces the Servlet 3 javax.servlet.http.Part API to support uploading files. By default Spring Boot configures Spring MVC with a maximum file of 1Mb per file and a maximum of 10Mb of file data in a single request. You may override these values, as well as the location to which intermediate data is stored (e.g., to the /tmp directory) and the threshold past which data is flushed to disk by using the properties exposed in the MultipartProperties class. If you want to specify that files be unlimited, for example, set the multipart.maxFileSize property to -1.The multipart support is helpful when you want to receive multipart encoded file data as a @RequestParam-annotated parameter of type MultipartFile in a Spring MVC controller handler method.

文档说明表示,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。要更改这个默认值需要在配置文件(如application.properties)中加入两个配置

需要设置以下两个参数

1
2
multipart.maxFileSize
multipart.maxRequestSize

Spring Boot 1.3.x或者之前

1
2
multipart.maxFileSize=100Mb
multipart.maxRequestSize=1000Mb

Spring Boot 1.4.x或者之后

1
2
spring.http.multipart.maxFileSize=100Mb
spring.http.multipart.maxRequestSize=1000Mb

很多人设置了multipart.maxFileSize但是不起作用,是因为1.4版本以上的配置改了,详见官方文档:spring boot 1.4

那些拿命换钱的年轻人,最后都怎么样了?

某次在出租车上和朋友聊起一个过去的同学。他和我关系关系一般,和朋友关系较好。聊着聊着,朋友告诉我,他死了。我愣了两秒钟。

第一次听见同龄人的死讯,心底一阵凉意。谈不上难过,或许在难过抵达之前,情绪更多地被讶异包围着。

以前总听老人家抱怨:这人好端端地,怎么走了。那时候听这句话没什么感觉。现在同样的事发生在同龄人身上,感触才深。

Read More

不以打工者心态工作

看完周鸿祎的《不以打工者心态工作》的视频后,感慨还是颇深的。
其中有一点印象很深刻,就是做的任何事情都会有回报的,付出多少,就会得到多少回报。一件事情,既然做了,就要认真努力的去做,不仅仅满足于做过这件事,还要做好,甚至做到极致。这个视频中的很多的观点又印证了我的所见所闻。很多的时候,就是一件不起眼的小事,一件没有人愿意做的事情,有人接手去做了,而那件事情就是他人生的转折点。培训经历之于周鸿祎,网络通信之于马化腾等等。

Read More

静态内部类

静态内部类就是个独立的类。之所以要弄这么个东西,只是起到一个注释的效果,而且这个注释可静态检查。
比如有A,B两个类,B有点特殊,虽然可以独立存在,但只被A使用。这时候怎么办?如果把B并入A里,复杂度提高,搞得A违反单一职责。如果B独立,又可能被其他类(比如同一个包下的C)依赖,不符合设计的本意。所以不如将其变成A.B,等于添加个注释,告诉其他类别使用B了,它只跟A玩。非静态的才是真正的内部类,对其外部类有个引用。

参考 https://www.zhihu.com/question/28197253

设计模式-装饰者模式

参考 Head First设计模式

装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

通常装饰者模式是采用抽象类。

装饰者模式使用场景

平时所用的Java I/O库就使用到了装饰者模式。

Read More

设计模式-观察者模式

参考 Head First设计模式

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

观察者模式的使用场景

比如swing中JButton可以有很多个Listener。
在数据报警中,可以给报警源注册邮件,钉钉,微信,短信等通知方式。

Read More

Java基础知识

1
2
3
4
5
>> 带符号右移。正数右移高位补0,负数右移高位补1。比如:  
4 >> 1,结果是2-4 >> 1,结果是-2-2 >> 1,结果是-1
>>> 无符号右移。无论是正数还是负数,高位通通补0
对于正数而言,>>和>>>没区别。
对于负数而言,-2 >>> 1,结果是 2147483647(Integer.MAX_VALUE),-1 >>> 1,结果是 2147483647(Integer.MAX_VALUE)。

Read More

HashMap

  1. 什么时候会使用HashMap?他有什么特点?
    存储键值对时要用到。它是基于Map接口的实现,接受null类型的键值对,是非同步的,HashMap存储着Entry(hash, key, value, next)对象。

  2. 你知道HashMap的工作原理吗?
    使用hash,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。

  3. 你知道get和put的原理吗?equals()和hashCode()的都有什么作用?
    通过对key调用hashCode()方法进行hashing,并计算下标( n-1 & hash),从而获得buckets的位置。如果产生碰撞,则利用key.equals()方法去链表或树中去查找对应的节点

  4. 你知道hash的实现吗?为什么要这样实现?
    在Java 1.8的实现中,是通过hashCode()的高16位异或低16位实现的:(h = k.hashCode()) ^ (h >>> 16),主要是从速度、功效、质量来考虑的,这么做可以在bucket的n比较小的时候,也能保证考虑到高低bit都参与到hash的计算中,同时不会有太大的开销。

  5. 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?
    如果超过了负载因子(默认0.75),则会resize一个原来长度两倍的HashMap,并且重新调用hash方法。
    允许使用 null 值和 null 键。

map.entrySet().iterator()比map.keySet().iterator()效率高

参考 http://googleapi.cc/000006

区块链简介

漫画区块链
区块链是一种去中心化的信任机制,一种全民记账的方式。安全可靠。区块链真正厉害的是它解决了中介信用的问题。区块链是比特币的技术基础。区块链的优势是无需中介参与,过程透明,数据高度安全。
区块链