jfinal多文件上传后台files.size()只有一个的解决方法

描述:看这个吧! jfinal附件上传选择多个,后台files.size()只有一个
问题大致情况
页面:

//页面
<form method="post" id="fileForm" enctype="multipart/form-data">
	<input type="file" value="" name="file" multiple="multiple" />
</form>

Controller:

//上传时选择多个文件,这里始终只有一个
List<UploadFile> files = getFiles();

这里的files值始终只有一个,单文件上传没有问题;看了相关文章,各有各的说法,最终尝试给解决,记录下:

多文件使用场景:
一般来说是在from表单里面有上传文件的,而上传文件都是以异步的方式上传(也是一个from表单);
如果在from 表单里直接嵌套文件上传的form表单,这样可能会出现其他的问题(两个表单都会提交…);
解决此情况的方法:
①在原来form表单里写一个input框,加上一个Onclick()事件
②在原来form表单外写一个上传文件的from表单,上面的Onclick()事件直接调用这里的上传input框,见下面例子:

<!-- loadFile() 将上传成功文件的文件名返回到原form表单的input框中 -->
<form method="post" id="fileForm" enctype="multipart/form-data">
	<!-- -->
	<input type="file" value="" id="file" name="file[]" multiple="multiple" style="display: none;" onchange="loadFile(this)"/>
</form>

<form id="form1" method="post">
	...
	<div class="form-group">
		<label class="col-sm-4 control-label">图片:</label>
		<div class="col-sm-5 right" id="div_gztp">
			<!-- 记录文件上传成功后返回的信息,这里是文件id -->
			<input type="hidden" id="file_ids" name="rec.file_ids" />
			<!-- 为了增强体验效果,加的一个上传动画 -->
			<input id="input_file" name="fileTitle" type="text" value="请选择需要上传的图片" onclick="uploadImage();" class="form-control" readonly="readonly" style="border-radius:0px;"/>
		</div>
		<div class="input-group">
			<!-- 不自动上传,选择文件后点击此按钮才进行上传 -->
			<button class="btn btn-primary" style="border-radius:0px;" id="uploadFile">上传</button>
		</div>
	</div>
	...
</form>

JavaScript的写法

//fileForm 为上传文件的form表单的id
$("#fileForm").submit(function() {
	$("#uploadFile").attr("disabled", true);
	if($("#file").val() == "") {
		alert("请选择需要上传的图片。");
		$("#uploadFile").attr("disabled", false);
	} else {
		$("#uploadFile").text("正在上传...");
		submitFile();
	}
	return false;
});

function submitFile() {
	//将正在上传的gif给显示出来
    $(".loading").show();
    var formData = new FormData();
    //这里是关键,把选择的多文件对应的一个name值变成多个name值,
    //这里就是导致为什么后台只有一个文件的原因
    for(var i=0; i<$('#file')[0].files.length;i++){
        var sdf = $('#file')[0].files[i];
        formData.append('file['+ i +']', $('#file')[0].files[i]);
    }
    $.ajax({
        type: "post",
        url: basePath + "/order/uploadFile",
        data: formData,
        //下面这两个属性要加上,不然要报后面的错误
        processData: false,//Uncaught TypeError: Illegal invocation
        contentType : false,
        success: function(result) {
            if(result.flag){
            	//框架自带弹框,根据使用的框架自行更改
                ui.success("文件上传成功。");
                $('#file_ids').val(result.ids);
                clearFile();
                //更改标识
                $('#is_upload').val('end');
            } else {
            	//result.error自己封装返回到页面的信息
                ui.error(result.error);
            }
            loadingHideorDisabled();
        },
    });
}

这样后台再使用List<UploadFile> files = getFiles();就能获取到多个文件了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以回答这个问题。使用jfinal框架可以很方便地实现ftp文件上传。首先需要在pom.xml文件中添加jfinal-ftp的依赖,然后在Controller中编写上传文件的方法,使用FTPKit工具类进行文件上传。具体实现可以参考jfinal官方文档或者相关的教程。 ### 回答2: JFinal一个基于Java的轻量级、高性能的Web框架,它提供了简单易用的API,方便开发人员快速开发Web应用程序。虽然JFinal主要用于开发Web应用程序,但是我们还是可以利用其强大的API来实现FTP文件上传功能。 实现FTP文件上传功能需要借助于Apache Commons Net库。首先,我们需要在项目中引入相应的依赖。在pom.xml文件中添加以下内容: ```xml <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.8.0</version> </dependency> ``` 接下来,我们创建一个Controller类,在该类中编写上传文件的逻辑。首先,我们需要获取上传文件的相关信息,包括文件名、路径等。然后,利用FTPClient类实现与FTP服务器的连接和上传文件的功能。最后,根据上传结果返回相应的提示信息。 以下是一个简单的FTP文件上传的示例代码: ```java import com.jfinal.core.Controller; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import java.io.FileInputStream; import java.io.IOException; public class UploadController extends Controller { public void index() { // 获取上传文件的相关信息 String filename = getPara("filename"); String filepath = getPara("filepath"); // 创建FTPClient对象 FTPClient ftpClient = new FTPClient(); try { // 连接FTP服务器 ftpClient.connect("ftp.example.com", 21); ftpClient.login("username", "password"); // 设置文件传输类型为二进制 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 设置文件上传路径 ftpClient.changeWorkingDirectory(filepath); // 上传文件 FileInputStream fis = new FileInputStream(filename); ftpClient.storeFile(filename, fis); fis.close(); // 上传成功提示信息 renderText("文件上传成功"); } catch (IOException e) { e.printStackTrace(); // 上传失败提示信息 renderText("文件上传失败"); } finally { // 断开与FTP服务器的连接 try { ftpClient.logout(); ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 以上就是使用JFinal框架实现FTP文件上传的简单示例代码。我们可以通过访问URL来调用该接口并传递文件信息,从而实现文件的上传功能。当然,在实际开发中,我们还需要添加一些安全验证、错误处理等功能来完善这个上传文件的功能。 ### 回答3: 使用jfinal编写FTP文件上传功能非常简单。首先要添加jfinal的依赖包到项目中,并配置好jfinal的配置文件。 接着,在Controller类中创建一个方法用于处理文件上传请求。首先,我们需要获取到上传的文件,可以通过使用jfinal提供的方法`getRequest().getFile("file")`来实现。这个方法会返回一个UploadFile对象,其中包含了上传的文件信息。 接下来,我们需要将上传的文件保存到FTP服务器上。可以使用Apache Commons Net库中的FTPClient类来实现FTP文件上传功能。首先,我们需要连接到FTP服务器,可以通过调用FTPClient对象的`connect()`方法来连接。然后,使用`login()`方法进行登录。 接着,我们可以使用`changeWorkingDirectory()`方法切换到指定的目录。然后,使用`storeFile()`方法将上传的文件保存到FTP服务器上,其中需要传入服务器上保存的文件名和要上传的文件流。 上传完成后,记得要关闭FTP连接,可以使用`logout()`方法进行退出,然后调用`disconnect()`方法关闭连接。 最后,我们在Controller中处理上传结果,可以返回相应的消息给前端页面,告知上传是否成功。 总结一下,使用jfinal编写FTP文件上传功能主要包括以下步骤:获取上传的文件、连接到FTP服务器、上传文件、关闭FTP连接、处理上传结果。相比传统的socket编程方式,使用jfinal简化了很多操作,提高了开发效率。希望这个简单的回答能帮助到您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值