超详细的两种文件上传方式

简述:

1.文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。
2.文件上传在应用开发时,运用广泛,例如:大众点评分享笔记时上传图片,发朋友圈等都使用了文件上传功能。

本地存储

简介

本地存储即使将想要上传的文件上传到本地文件加上,当你启动项目时,自己的window机就相当于一个服务器,本地磁盘就可以成为文件上传的储存地。

在这里插入图片描述

主要步骤

1.选择文件,进行图片上传,将图片文件上传到服务器存储起来,然后返回图片访问的URL
2.当点击保存时,除了页面的基本表单数据需要提交到服务端,图片访问的URL,也需要提交到服务端

注意: 在SpringBoot中,文件上传,默认单个文件允许最大大小为 1M,如果需要上传大文件,可以在application.properties进行如下配置:

#配置单个文件的最大上传大小
spring.servlet.multipart.max-file-size=10MB
 
#配置单个请求最大上传大小(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB

实现步骤

首先,我现在基于一个项目来做,当我前端点击上传图片的时候,前端就会发送请求/common/upload到服务器,然后,项目基于图片路径进行下载/common/download回显。

代码如下:

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
    @Value("${reggie.path}")
    private String basePath;
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws IOException {
        log.info("上传文件{}",file.toString());
        //	封装文件名称,防止名称重复
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.indexOf('.'));
        String fileName = UUID.randomUUID().toString();
        //  判断是否存在basePath,如果不存在,先创建
        File dir = new File(basePath);
        if(!dir.exists()){
            //  目录不存在的话,创建目录
            dir.mkdirs();
        }
        file.transferTo(new File(basePath+fileName+suffix));
        return R.success(fileName+suffix);
    }

    /**
     * 文件下载
     * @param name 需要下载的文件名
     * @param response  响应前端,回显图片
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException {
        //输入流读取目标文件
        FileInputStream inputStream = new FileInputStream(basePath + name);
        //输出流回显数据
        ServletOutputStream outputStream = response.getOutputStream();
        //设置响应类型
        response.setContentType("image/jpeg");
        int len = 0;
        byte[] bytes = new byte[1024];
        //以bytes大小读取文件
        while ((len=inputStream.read(bytes)) != -1){
            outputStream.write(bytes,0,len);
            outputStream.flush();
        }
        outputStream.close();
        inputStream.close();
    }

上面就是实现本地存储的步骤,baseUrl就是存储路径,前端传送的图片,视频,文件等都是MultipartFile类型的,然后使用transferTo就可以进行上传了。

实现效果
在这里插入图片描述

在这里插入图片描述

缺点

1.不安全:磁盘如果损坏,所有的文件就会丢失
2.容量有限:如果存储大量的图片,磁盘空间有限(磁盘不可能无限制扩容)
3.因为磁盘权限问题,无法直接访问

阿里云oss

简介

由于为了解决本地存储的缺点,就是用了阿里云OSS存储器,将图片存储到一个自己公共的云端上,便于自己操纵自己的文件。

主要步骤

在这里插入图片描述

实现步骤

1.首先注册阿里云:

进入到https://www.aliyun.com/进行注册
控制器->搜索OSS->开通OSS服务
在这里插入图片描述

2.创建bucker
在这里插入图片描述
3.获取AccessKey(密钥)

点击我的头像->AccessKey管理->创建AccessKey;每次使用就可以通过手机验证进行查看key跟KeySecret。

在这里插入图片描述

基于SDK实现一个小Demo
在这里插入图片描述

基于SDK进行实现阿里云OSS云存储
在这里插入图片描述

package com.itheima.reggie.common;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;

import java.io.FileInputStream;
import java.io.InputStream;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
//        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "换成自己的buckName名称";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "上传文件后的名字";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        String filePath = "上传文件的具体位置";

        String accessKeyId = "换成自己的accessKeyId";
        String accessKeySecret = "通过手机验证查看自己的accessKeySecret";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);

        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
} 

我这里并没有基于EnvironmentVariableCredentialsProvider创建OSSClient实例。而是通过OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret)进行创建。

运行效果
在这里插入图片描述

这样就可以将自己本地的文件上传到阿里云上了,然后前端想进行回显,也不需要进行下载了,直接< img src=“url”> 即可。

封装成一个工具类进行使用

1.封装工具类AliOssUtil

@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    /**
     * 文件上传
     *
     * @param bytes
     * @param objectName
     * @return
     */
    public String upload(byte[] bytes, String objectName) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        //文件访问路径规则 https://BucketName.Endpoint/ObjectName
        StringBuilder stringBuilder = new StringBuilder("https://");
        stringBuilder
                .append(bucketName)
                .append(".")
                .append(endpoint)
                .append("/")
                .append(objectName);

        log.info("文件上传到:{}", stringBuilder.toString());

        return stringBuilder.toString();
    }
}

2.使用AliOssProperties注入工具类属性

@Component
@ConfigurationProperties(prefix = "reggie.alioss")
@Data
public class AliOssProperties {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

}

3.在配置文件设置自己的属性值
在这里插入图片描述
4.更新之前的upload方法

 @Autowired
    private AliOssUtil aliOssUtil;
    //  基于阿里OSS进行文件存储
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){
        try {
            //  封装存储名字
            String originalFilename = file.getOriginalFilename();
            String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            String objectName = UUID.randomUUID().toString()+extension;
            String filePath = aliOssUtil.upload(file.getBytes(), objectName);
            return R.success(filePath);
        } catch (IOException e) {
            e.getStackTrace();
        }
        return R.error("未知错误");
    }

5.效果展示
在这里插入图片描述

补充说明

通过上面步骤就实现了将文件上传到阿里云OSS对象存储上,这里上传成功后,每个文件都会有一个url地址,当你想下载的时候,直接进行url应用即可。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<项目介绍> 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者企业员工下载,适合小白学习或者实际项目借鉴参考! 当然也可作为毕业设计、课程设计、课程作业、项目初期立项演示等。如果基础还行,可以在此代码基础之上做改动以实现更多功能。 本项目主要实现了疾病自诊和医生推荐两个功能并构建了医生服务指标评价体系。疾病自诊主要通过利用BERT+CRF+BiLSTM的医疗实体识别, 建立医学知识图谱, 从而实现基于患者问诊文本的疾病初诊。这个功能帮助患者初步了解自身的疾病情况并为下一步与医生的交流提供支持。 第二个功能是医生推荐。本平台采用基于Jacard距离的Minhash和minhashLSHForest算法来进行推荐, 匹配患者的咨询文本和医生的历史问诊信息,从而为患者推荐最适合的医生。最后我们使用django框架进行项目发布。 数据采集 本项目除了使用公开的医疗数据集外,还采集了中国领先医疗平台的数据集。 `spiders`模块提供了数据采集的信息。 39crawler用于获取39健康网的数据,hdf用于获取好大夫网的数据(scrapy)。 我们还提供了编译后的代码程序,感兴趣的同学可以通过百度网盘获取。 链接:https://pan.baidu.com/s/149ttC2KJJLA9HJl8YYKkLg 提取码:见资源 运行程序在dist文件夹中,双击spider_run.exe即可运行爬虫程序。 爬取指定的疾病信息,在disease.txt加入科室名称(拼音)或者疾病名称(拼音),每一个科室或者科室占据单独一行。 无论你在disease.txt文件中添加多少行,爬虫只会爬取第一行对应的科室或疾病,结果将在程序运行完成后,输出为doctor.csv,disease.csv。 如需爬取第二个疾病,请将第一行科室或者疾病删去,重新运行程序。 ## 3.疾病自诊 在疾病自诊模块,平台会读取用户疾病描述的语义信息,首先进行文本预处理,然后通过实体识别模型抽取出其中的关键成分,即:疾病症状、并发症、身体部位等医学实体。然后,这些医学实体会输入到平台后端的知识图谱(基于大规模数据集构建)中。最终,通过知识图谱的快速查询和计算,平台将返回基于患者疾病描述的疾病推断以及相应的概率值。同时,疾病相关的介绍、需要去就诊的科室和疾病多发人群的相关信息也会推送给用户。 ### 3.1. 医学实体识别 医疗实体识别是指从给定句子中识别出医疗实体。在本项目中,需要从患者咨询的病情描述中识别出疾病、症状、科室等多种类型的医疗实体,找到与疾病特征相关的关键词。 `entity_extract`模块提供了有关医学实体识别的有关信息。 支持识别的实体类型 ~~~~ body:患病部位,如:胃,皮肤 drug :药品,如:产妇康清洗液 feature:患病程度,如:严重 disease:疾病,如:前列腺炎 symptom:疾病症状,如:胃壁增厚 department:科室,如:五官科 test:疾病相关的检查,如:血常规 模型选择 我们在训练集上检验了BERT、BERT+CRF、BERT+BiLSTM和BERT+BiLSTM+CRF各模型的准确率、召回率和micro_f1值后,我们发现BERT+BiLSTM+CRF模型具有更好的医疗实体识别能力,因此,在本项目中,我们选用`**BERT+BiLSTM +CRF**`模型完成后续医疗实体识别的任务。 知识图谱构建 为了进行准确的疾病诊断,我们依托于大规模数据集构建知识图谱。 `build_kg`模块提供了有关知识图谱构建的信息。 我们将应用于疾病自诊这一模块的所需实体标记为诊断检查项目、科室、疾病、药品、患病的部位、疾病症状、患病程度,在用户输入一段文本后,我们首先通过实体识别将以上这些关键实体识别出来。 通过事先考察,我们发现在进行疾病诊断的过程中,不仅仅是以身体的症状为依据,也有许多其他的所属关系可供我们参考。因此在进行关系抽取中,我们将各个实体间的关系分为8类,分别为属于、疾病常用药品、疾病对应科室、疾病别名、疾病所需检查、疾病部位、疾病症状、疾病并发疾病。我们通过以上8类关系判断在知识图谱中实体间两两之间的关系,从而计算出患该种疾病的概率。定义知识图谱实体间关系的描述性统计特征如下表所示。 医生推荐 在医生推荐模块,平台期望寻找到历史数据中与用户最相似的患者,并找到与之对应到相应的医生,来完成个性化的推荐。具体而言,平台首先通过用户的描述文本获
文本编辑器,支持文本编辑,比较,FTP编辑,FTP上传下载,加密,十六进制编辑,列模式,回行显示,正则表达式,多行查找和替换,代码折叠,关键字高亮显示,编辑400GB的大文件,比较100GB的大文件,对过1G的大文件排序,删除重复,执行自定义脚本自动修改文件。 PilotEdit 中文多语特别版PilotEdit 中文多语特别版 PilotEdit 中文版- 功能 1. PilotEdit支持过400G的文件 >编辑过400GB(400亿行)的文件 >上传/下载过4G的FTP文件 >加密/解密过4G的文件 >比较过4G的文件 2. 全面支持UNICODE文件和DOS/UNIX文件 >快速改变多个文件的编码 >在不同编码的文件中拷贝文字时自动调整文字编码 3. 自定义的文件类型和关键字高亮显示 >支持过20种文件类型 >支持自定义文件类型 >对不同的文件类型定义不同的TAB和缩进 比如,您可以定义当用户按TAB键时,在C/C++中输入TAB键,而在Java文件中输入四个空格 4. 十六进制编辑模式 >在十六进制编辑模式中可以很方便地插入,修改,删除,拷贝,粘贴 >十六进制编辑模式查找和替换 >当从十六进制编辑模式切换回文本模式时自动检测文件类型 >在十六进制编辑模式和文本模式中无限的undo/redo 5. 列模式 >键盘输入的字符将被插入到列模式中所有选中的行 >如果粘贴一行文字,这行文字将被插入到列模式中所有选中的行 >如果粘贴多行文字,这些文字将被逐行被插入到列模式中选中的行 6. 无限的undo/redo >在十六进制编辑模式和文本模式切换后仍然可以无限次地undo/redo 7. 回行显示 >即便在编辑一个几百MB的文件时,切换到回行显示仍然非常迅速 8. 编辑FTP文件 >打开和保存FTP文件 >删除多个FTP文件和目录 >上传/下载多个FTP文件和目录 9. 基于多行的查找和替换 >查找/替换多行文本 >用正则表达式查找/替换多行文本 10. 文件比较和合并 >比较两个基本点目录 >比较合并两个文件 >在文件比较窗口中直接编辑文件 >当文件内容改变时文件比较窗口自动更新比较结果 >在文件比较窗口中查找/替换 >查找上一个/下一个不同的文本块 >将所有相同/不同的行拷贝到剪贴板。通过这个功能,我们可以很方便地找出第一个文件中存在而第二个文件中不存在的行 11. 自定义字符串表 >单击即可添加一个自定义的字符串 >在所选文本的前后分别添加自定义的字符串 12. 正则表达式 >用正则表达式查找/替换多行文本 13. 脚本文件 >可以把常用的正则表达式定义在脚本中,直接运行脚本即可替换文字 14. 256位 AES加密/解密 >用PilotEdit直接透明地编辑一个加密的文件 >加密/解密多个文件和目录 >加密/解密过4G的文件 15. 文件组 >双击文件组可以快速打开多个文件 16. 在多个目录中查找/替换 >支持多行的查找/替换 17. 排序 >按升序/降序排序 >按文本或数字排序 >按一列数据排序 >按正则表达式排序 18. 查找/删除重复的行 >在打开的文件中查找/删除重复的行 >按文本或数字比较 >按一列数据比较 >按正则表达式比较 19. 收集字符串 >将匹配正则表达式字符串拷贝到的剪贴板。比如,我们可以把一个文件中所有的Email地址拷贝到剪贴板。 20. 将打开的文件用原目录结构另存为新文件 >同时拷贝选中的文件和目录结构 21. 编辑SFTP文件 >打开和保存SFTP文件 >删除多个SFTP文件和目录 >上传/下载多个SFTP文件和目录 PilotEdit支持以下操作系统 Windows 2000 Windows 2003 Windows XP Windows Vista Windows 7 Windows 2008 Windows 8 PilotEdit不支持Win98和 WinNT. PilotEdit支持以下和更多文件类型: C, C++ Files Java Files HTML Files XML Files Oracle SQL Files UNIX/Linux Shell Files JSP TCL/TK Files BAT files PilotEdit Script Javascript Files PHP ASP Assembly ASP.NET CSS Visual Basic Perl C# Python Ruby XHTML Files COBOL AHK Script Inno Setup Script AutoIt Script
淘宝商品推广,店铺推广及管理功能。 淘宝商品,店铺一键更换PID. 淘宝搜索推广代码,合作标示代码均在后台添加. 客户注册与否均可购物、留言、评论、发送站内消息。 取回密码功能。会员密码及取回密码的答案均以MD5加密,确保安全。 发送站内消息自动附加原文,并以不同颜色区分原文。 管理员可发送公共消息,可查看会员是否阅读或删除管理员发送的消息。 后台“会员管理”中可查看会员登陆IP、会员详细资料,可在线给会员发送普通电子邮件、实时QQ交谈。 强的会员搜索功能,可根据会员ID、姓名、邮箱、电话、QQ、注册时间等条件搜索会员。 邮件群发功能,可向会员邮箱群发普通电子邮件。 支持jmail、cdonts两种方式发送邮件。 整合功能卓越的《留言本》,界面美观、功能强大,支持留言审核、留言固顶、脏话过滤。 新增商品评论功能。 QQ在线咨询功能大大增强,可自由的打开或关闭在线咨询面板、可设置其显示位置、可显示中文昵称、可设置在线、留线提示语,5种QQ头像样式、5种眩目的面板样式。 网站自由开关,维护网站时在后台关闭网站即可,关闭时可显示提示语。 9种界面风格、4种商品图片边框样式、3种验证码样式、9种横幅图片装饰效果,大小横幅均可开可关,可使用普通图片也可使用Flash动画,灵活多样的设置将组合出千变万化的 效果。 来访IP限制,阻止竞争对手或恶意访问者访问本站。 新增自动锁定IP功能,自动对恶意刷屏、恶意猜解密码、非法登陆者自动锁定IP、限制访问。 功能强大的帮助信息管理器。 实用的导航工具条。 方便的网页扩展功能,主页底部要添加任何文字、图片或代码(例如加入百度搜索框、添加网站ICP备案信息),均可放入“网页扩展”中,无需修改源代码。 强大的广告管理功能,网店标志、大小横幅、广告图片、侧边对联广告,所有图片和FLASH动画均可直接在后台上传,从此告别FTP。 所有广告均可开可关,满足你的个性需求。 强的分类管理,商品分类随心所欲自由排序、修改分类时同步更新所属商品。 同类系统中最强大的商品管理功能,可方便的编辑、提升、推荐、设置特价商品,可根据众多条件快速搜索商品,可方便的转移商品。 内嵌仿Word在线编辑器,可在商品介绍、新闻页面插入表格、图片、Flash动画、视频等。 商品属性完全自定义,例如您可添加“生产厂家”、“商品单位”、“颜色”这些属性。 支持不限数量的商品多图,使用无组件上传图片,任何标准ASP空间均可正常使用。 独创搜索统计,访问者搜索过的关键词全部记录下来,使管理员了解客户需求。 实用的新闻功能,支持新闻固顶,内嵌仿Word在线页面编辑器。 全新设计的友情链接功能,支持不限数量的链接,支持文字、图片链接,友情链接可开可关。 独创在线修改后台目录,在线修改数据库文件名(智能同步修改数据库连接文件),数据库在线备份、压缩、下载、上传、恢复等。维护网站从此可完全抛开FTP了。 支持多管理员,不同管理员可设置不同权限。 访问统计功能。 投票功能。 便捷的网站推广通道,加入了十余种搜索引擎的在线登记功能。 登陆、留言、评论、取回密码,均加设验证码,有效防止恶意猜解密码、非法登陆,有效对付留言机器人、以及各种广告、非法信息的骚扰。 同类系统中最为强大的商品高级搜索功能,可根据众多条件搜索商品,再大的商城也能轻松找到所需商品。 创新的后台登陆方式,智能登陆未知后台目录,有效保证后台安全。 众多功能的细节之处体现了极致的人性关怀,细致、体帖入微,设计中充分考虑了客户、管理员操作的方便。 数据库在App_data文件夹中,附加即可 用户名和密码是51aspx

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值