<input type='file'/>选择文件,通过ajax方式传递选择的文件,后端使用controller接受

要实现的功能:页面使用html5的上传控件<input type="file" />选择图片,所选图片可进行预览,然后可对某一张图片进行删除。然后将最终的图片列表上传;

问题:上传控件不允许通过js修改已选择的文件,所以不能实现单独删除功能;

解决方法:定义一个全局的数组变量用来存放图片文件列表。每次选择完图片后都将所选图片push到数组中,删除图片也是操作这个数组。然后将这个数组放到formdata内,通过ajax的方式传递给后台;

关键的代码片段:

<input type="file" id="files" multiple="multiple" οnchange="addFiles();"/>

<div class="preview"></div>

<button type="submit" id="uploadBtn">上传</button>

<script>

$(function{

fileStack=[];//存放图片文件的数组

             $("#uploadBtn").on("click", function() {
                 var formdata = new FormData();
                $.each(fileStack,function(i,file){//所有文件都要放到同一个名字下面:如files
                    formdata.append("files",file);
                 });
               $.ajax({  
                   url : "test",  
                   type : 'POST',
                   dataType: 'json',
                   data : formdata, 
                   cache: false,
                   processData: false,
                   contentType: false,
                   success : function(responseStr) {  
                       alert("成功");    
                   },  
                   error : function(responseStr) {  
                       alert("失败");
                   }  
               });
        });

});

        function addFiles(){
            var files = document.querySelector("input[type=file]");
            var filelist = files.files;//选择图片列表
            $.each(filelist,function(i,file){
                fileStack.push(file);
                var reader = new FileReader();  
                reader.onload = function(e){
                       var result = this.result;
                       var img = document.createElement("img");
                       img.src = result;
                       $(".preview").append(img);
                   };
                   reader.readAsDataURL(file);
            });
        }

</script>

后端接收代码:  

   @RequestMapping(value="/test",method=RequestMethod.POST)
    public void test(@RequestParam("files") MultipartFile[] files) throws IOException{
        for(MultipartFile file : files){
            String fileName = file.getOriginalFilename();
            System.out.print("文件:"+fileName+" 上传成功");
        }
    }

其实很多代码看着并不陌生,似乎网上都有类似的,但是我之前在解决这个问题的时候,发现网上很多的搜索结果给的都是不完整的解决方法。导致我总是无法把代码连接起来。(关键是我比较菜。别人可能觉得没啥好说的,可是我却看不懂)。所以自己解决了这个问题后,写出来跟大家分享一下。有需要的看看就行,大神就当没看见,漠视就行了。第一次写自己的一些总结。凑活看吧!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
请帮我修改实现视频上传服务器这是前端代码:<!DOCTYPE html> <!-- Coding By CodingNepal - youtube.com/codingnepal --> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>File Upload with Progress Bar | CodingNepal</title> <link rel="stylesheet" href="annotation/File Upload in JavaScript/style.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"/> </head> <body> <div class="wrapper"> <header>File Uploader JavaScript</header> <form action="#"> <input class="file-input" type="file" name="file" hidden> <i class="fas fa-cloud-upload-alt"></i> <p>Browse File to Upload</p> </form> <section class="progress-area"></section> <section class="uploaded-area"></section> </div> <script src="annotation/File Upload in JavaScript/script.js"></script> </body> </html>,这是后端代码:<?php namespace app\index\controller; use think\Controller; use think\migration\db\Table; use Util\data\Sysdb; use app\index\controller\BaseAdmin; use think\Db; use think\Filesystem; // 在控制器文件的顶部添加这一句 use think\Request; class Test extends Controller { public function index(){ return $this->fetch(); } public function myMethod() { // 执行操作 // ... // 返回 AJAX 响应 $response = ['status' => 'success', 'message' => '操作成功']; return json($response); } public function upload() { return $this->fetch('test/upload'); } public function save(Request $request) { // 获取上传的文件 $file = $request->file('video'); // 将文件保存到服务器上 $saveName = Filesystem::disk('public')->putFile('videos', $file); // 将视频信息存储到数据库中 $data = [ 'filename' => $file->getOriginalName(), 'path' => $saveName, 'type' => 'video/' . $file->guessExtension(), 'size' => $file->getSize(), 'created_at' => date('Y-m-d H:i:s', time()) ]; Db::name('videos')->insert($data); // 返回上传结果 return json([ 'status' => 'success', 'filename' => $file->getOriginalName(), 'path' => $saveName ]); } }
05-15

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值