2020年2月

使用 Spring Boot 接收上传的文件,接收到的文件对象为srcFile,目标路径为 /upload/img/fileName.jpg,使用transferTo方法存储到本地:

File dstFile = new File("/upload/img/" + fileName);
srcFile.transferTo(dstFile);

提示目标文件路径不存在:

java.io.IOException: java.io.FileNotFoundException: C:\Users\syf\AppData\Local\Temp\tomcat.6910981657131718308.8080\work\Tomcat\localhost\ROOT\upload\img\5a6acf84e27448be9925959821ca1e90.png (系统找不到指定的路径。)

可以看见封装的transferTo方法自动把相对路径补全到了绝对路径,且是以 Tomcat 容器所在的临时目录为父目录补全的,而我们是想保存到项目的/upload/img/目录下。

解决方法:

不使用MultipartFile.transferTo,把 MultipartFile 对象转字节流后使用 FileOutputStream 手动保存二进制流:

// 这里的actualPath是相对项目根目录的路径
String actualPath = "src/main/webapp/upload/img/" + fileName;
String absolutePath = "/upload/img/" + fileName;

try {
    byte[] srcFileBytes = srcFile.getBytes();
    OutputStream f = new FileOutputStream(actualPath);
    f.write(srcFileBytes);
    f.close();
} catch (FileNotFoundException e) {
    System.out.println("File not found");
    System.out.println(actualPath);
    e.printStackTrace();
    return null;
} catch (IOException e) {
    e.printStackTrace();
    return null;
}
return absolutePath;

The Pale Blue Dot

这张照片是卡尔萨根说服整个 NASA,让航天器转个圈拍的一张地球照片,叫做“The Pale Blue Dot”

这是从40亿英里外的太空拍摄的地球照片,太阳光束上的那一个小点就是我们的家

- 阅读剩余部分 -

gauss_test.png

如图,需要对数据集生成对应的 HeatMap 数据,中心点值为1,向四周生成一个高斯分布。

高斯分布又叫正态分布,最近武汉新型冠状病毒的确诊人数应该就是一个很类似正态分布的图,虽然还不知道什么时候会是高峰期。

正态分布的概率密度函数为 $$f(x)=\frac{1}{\sqrt{2\pi}\sigma}e^\frac{(x-\mu)^2}{2\sigma^2}$$,对应图像如下:

Normal Distribution PDF

根据这个公式,就可以写出生成一维高斯分布的函数:

def get_gauss(n):
    u = 0  # 均值μ
    sig = math.sqrt(1)  # 标准差δ
    x = np.linspace(u - 3*sig, u + 3*sig, n)
    y = np.exp(-(x - u) ** 2 / (2 * sig ** 2))/(math.sqrt(2*math.pi)*sig)
    y = normalize(y)
    return y

注意此时生成的高斯分布数据还需要进行归一化:

def normalize(x):
    max = x.max()
    min = x.min()
    return (x - min) / (max - min)

最后将两个一维的高斯分布矩阵相乘即可,完整代码如下:

- 阅读剩余部分 -