前端上传文件问题。。。

我有一个表格,表里的一个input要上传文件,请问我这个做法对吗?
1.创建一个input type=“file”然后绑定(click)事件
2.在click事件的function中上传图片到后端API
3.后端API返回文件的URL
4.把URL显示在input中,
5.提交表格按钮创建个submit事件
6.提交表格?

这个办法可以,但是不是ajax的,体验可以改进下。

从逻辑上讲是没什么问题,提个建议,既然是在表格中,那么可以通过font awesome 或者 使用png图标 来做一个按钮,同时搭配一个禁用的删除按钮,可以用title写上按钮的功能,点击后弹出一个上传的界面。上传成功后就把上传的按钮换成下载的按钮,删除的按钮 禁用取消。这样的话更好一些,不要把url暴露在用户面前

直接提交表单将所有数据一起提交就行了,干嘛需要多请求一次服务器?

https://blog.csdn.net/uniqueweimeijun/article/details/72855655这是我之前写的一个小案例,希望楼主可以看看,涉及到表单的提交ajax请求以及后台接收

这个方法没问题,说不上对错,不过后台处理上传文件的时候,如果文件非常大,前台会等待很久就是了。
文件上传为了保证内容不出错都是流传输,其实你也是试试直接提交整个form,然后后台把接收到的流整个保存成TXT
txt内容类似这样:
----[流的头部]------
时间什么的

-----------------------87998794654【一个号】
type=......name=....

内容

-----------------------879879768787【又一个号】
type=......name=....

内容

---------------------。。。【按照你form内各种可提交标签的顺序依次排列,其中某一个就是你的file】

不知道你想达到一个什么目的,如果是为了可以一键上传,可以整体按照流传输传送整个form,然后把这个流解析一下,按照内容分别保存就可以。
如果是为了先上传文件然后能有个缩略图什么的,最早是用iframe单独做一个上传,传送完毕后显示缩略图,和一个hidden的文件url或者文件标记,
上层窗口取出来之后放到正式的form里面,然后通过提交你最前面的form单独传递其他信息。现在是用ajax,在前台处理你的文件,然后分分段向后台post,后台把每次上传的部分分别接收整理成一个文件,这种的好处是可以做进度条,而且前台表现好一些。

https://blog.csdn.net/uniqueweimeijun/article/details/72855655
上边链接有问题哈哈。

表单属性应该还要设置enctype="multipart/form-data"吧

input输入框type为file文件模式,然后通过建立工厂模式区分是普通表单还是文件上传

页面 enctype="multipart/form-data"判定为文件


请上传缩略图: width="100px" height="200px" />
 

后台 控制层
@RequestMapping("insert")
public String insertType(@RequestParam MultipartFile coursePictureFile,HttpServletRequest request) throws IllegalStateException,IOException {
    // 原文件名称
    String picName = coursePictureFile.getOriginalFilename();
    File updaFile = null;
    String newName = null;
    String image = request.getParameter("image");
    if (!picName.equals("")) {
        // 创建新文件名称
        newName = UUID.randomUUID().toString()
                + picName.substring(picName.lastIndexOf("."));
        // 创建上传图片
        updaFile = new java.io.File("F:\\develop\\upload\\temp\\course\\" + newName);
        if (!updaFile.exists()) {
            updaFile.mkdirs();
        }

        // 上传文件
        coursePictureFile.transferTo(updaFile);
        // 删除原来的图片
        File deleFile = new File("文件保存路径" + image);
        deleFile.delete();
        course.setCourseImage(newName);
    } else {
        course.setCourseImage(image);
    }

    courseService.insert(course);
    return "redirect:/CourseAction/getCourseByPage.action?pageNo=1";
}
不知道是不是你要的

前台

请上传缩略图: width="100px" height="200px" />
 

input输入框type为file文件模式,然后通过建立工厂模式区分是普通表单还是文件上传,或者用ant design的组件,好上手好用

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

建议和表单数据一起提交,统一处理。如果是异步的,你这个思路是没什么问题的。

可以利用formdata

没看懂,干嘛要对文件域绑定click事件去提交上传的文件,正常不是点击文件域的浏览按钮选择本地文件上传到服务器吗?
还有你通过绑定的事件去上传文件接着又将服务端什么的url回显到html页面,到时表单提交的时候,文件域本地查找怎么能找到url指定的文件?

按照你得思路来,首先你得保证后台接口能够接受到你上传的文件(也就是文件流了),所以说你form表单肯定要一并提交的。
首先写好前端文件上传的代码:


此时你的上传HTML代码已经写好了,于是你想着如何把上传的文件提交给后台了
然后你跟着自己的想法写了个click事件:

$("#sub").click(function(){
// 陷入了难题,我该怎么把文件提交给后台啊???你想着直接把form表单提交过去行不行
var form = document.getElementById("uploadFile");
// 然后你兴奋的写着ajax请求
$.ajax({
type : "POST",
url : "xxxx.xxxx",
data : form,
success : function(result){
// 楼主此时想着拿到上传完后的文件URL
if(result.code == 200){
// 4.把URL显示在input中
????为什么要显示在input中????
没办法楼主这么说的,然后我私自改成了img
var filePath = result.data.filePath;
}else{
alert("文件上传失败");
}
},
error : function(){
alert("网络异常");
}
});
});

我的代码怎么落下了

<input type="button" id="sub" value="上传文件" />