el常使用搜集

本文介绍如何在JSP中使用EL表达式和FN函数进行数组或集合元素的访问及字符串截取操作,包括必要的标签库导入方式及具体用例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当是集合或者数组是,通过index 例如:${item[0]}取值

el表达式截取:

1.导入fn

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

2.例:

${fn:substring(item[4], 0, 10)}
<think>我们参考了引用内容,用户希望不使用action属性,而是通过函数手动调用接口上传文件。根据引用[1],我们可以设置`action="#"`并禁用自动上传(`:auto-upload="false"`),然后通过`on-change`事件监听文件选择。但是,这里我们不需要使用`action`,所以可以完全去掉`action`属性(或者设置为空字符串),然后通过自定义函数来上传文件。 关键点: 1. 禁用自动上传:`:auto-upload="false"` 2. 不使用`action`属性(或者设置为空字符串,避免默认提交行为) 3. 通过`on-change`事件收集文件 4. 自定义上传函数,使用XMLHttpRequest或axios等发送文件 注意:引用[3]提到,在二次上传时,filelist中的文件对象可能不是原始的File对象,所以我们需要在on-change事件中保存原始文件(raw属性)的引用。 步骤: 1. 在el-upload组件中,设置`:auto-upload="false"`,并去掉action属性(或设置为空字符串)。 2. 使用`on-change`事件,将选择的文件保存到一个数组中(注意保存file.raw,因为这是原始的File对象)。 3. 创建一个自定义的上传函数,遍历保存的文件数组使用FormData构建请求数据,然后通过axios(或其它HTTP库)发送请求。 4. 在自定义上传函数中处理上传成功或失败的情况。 代码示例(Vue3 + Element Plus):</think>### 不使用 `action` 属性,通过函数手动调用上传接口的实现方案 根据引用内容[1][2][3],以下是完全脱离 `action` 属性,通过自定义函数调用上传接口的完整实现: #### 核心实现思路 1. **禁用自动上传** `:auto-upload="false"` 阻止默认上传行为 2. **移除 `action` 属性** 不使用组件内置的上传机制 3. **保存原始文件对象** 在 `on-change` 事件中保存 `file.raw`(原始 File 对象) 4. **自定义上传函数** 使用 Axios 等 HTTP 库手动发送请求 #### 完整代码示例(Vue3 + Element Plus) ```html <template> <el-upload ref="uploadRef" :auto-upload="false" <!-- 禁用自动上传 --> :on-change="handleFileChange" <!-- 文件变化监听 --> :on-remove="handleRemove" <!-- 文件移除监听 --> :show-file-list="true" > <el-button type="primary">选择文件</el-button> </el-upload> <el-button @click="handleManualUpload" type="success"> 手动上传文件 </el-button> </template> <script setup> import { ref } from 'vue'; import axios from 'axios'; // 使用 Axios 发送请求 import { ElMessage } from 'element-plus'; // 存储原始文件对象(File 对象) const rawFiles = ref([]); // 文件选择变化处理 const handleFileChange = (file, fileList) => { // 保存原始文件对象(关键步骤) rawFiles.value = fileList.map(item => item.raw); }; // 文件移除处理 const handleRemove = (file, fileList) => { // 同步更新文件列表 rawFiles.value = fileList.map(item => item.raw); }; // 手动上传函数 const handleManualUpload = async () => { if (rawFiles.value.length === 0) { ElMessage.warning('请先选择文件'); return; } try { const formData = new FormData(); // 添加所有文件到 FormData rawFiles.value.forEach(file => { formData.append('files', file); // 'files' 对应后端接收参数名 }); // 添加额外参数(可选) formData.append('userId', 123); formData.append('token', 'abc123'); // 调用上传接口 const response = await axios.post('/api/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' // 必须设置 }, onUploadProgress: progressEvent => { // 进度处理(可选) const percent = Math.round( (progressEvent.loaded * 100) / progressEvent.total ); console.log(`上传进度: ${percent}%`); } }); ElMessage.success(`上传成功: ${response.data.message}`); // 重置文件列表(引用[3]提到的二次上传问题) rawFiles.value = []; uploadRef.value.clearFiles(); // 清空组件内文件列表 } catch (error) { ElMessage.error(`上传失败: ${error.message}`); } }; </script> ``` #### 关键实现细节 1. **原始文件保存** ```javascript // 必须保存 file.raw(原始 File 对象) rawFiles.value = fileList.map(item => item.raw); ``` 避免引用[3]中提到的二次上传时文件对象类型错误问题 2. **FormData 构建** ```javascript const formData = new FormData(); rawFiles.value.forEach(file => { formData.append('files', file); // 支持多文件上传 }); ``` 3. **文件类型限制(引用[1])** ```html <el-upload accept=".pdf,.docx,.xlsx"> <!-- 限制可接受的文件类型 --> ``` 4. **before-upload 处理(引用[2])** ```javascript const beforeUpload = file => { if (file.size > 10 * 1024 * 1024) { ElMessage.error('文件大小不能超过10MB'); return false; // 阻止添加到文件列表 } return true; } ``` #### 优势与注意事项 1. **完全控制上传流程** 可自定义请求头、参数、错误处理等 2. **避免 `action` 限制** 支持更复杂的业务场景(如分片上传、鉴权等) 3. **文件列表重置(重要)** ```javascript // 上传后必须重置(解决引用[3]的二次上传问题) rawFiles.value = []; uploadRef.value.clearFiles(); ``` 4. **进度显示实现** 通过 `onUploadProgress` 回调实现自定义进度条: ```html <el-progress :percentage="uploadPercent" /> ``` #### 工作流程 ```mermaid graph TD A[用户选择文件] --> B[on-change保存file.raw] B --> C[点击手动上传按钮] C --> D[构建FormData对象] D --> E[发送Axios请求] E --> F[处理响应结果] F --> G[重置文件列表] ``` #### 见问题解决方案 1. **文件类型验证失败** ```javascript const beforeUpload = file => { const validTypes = ['image/jpeg', 'image/png']; if (!validTypes.includes(file.type)) { ElMessage.error('仅支持JPG/PNG格式'); return false; } return true; } ``` 2. **大文件分片上传** 使用 `File.slice()` 分割文件后分批上传 3. **跨域问题** 确保服务端配置 CORS 头部: ```http Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST, OPTIONS ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值