@Autowired
Throw_in_spService throwInSpService;
@GetMapping("/importExcelThrow_in_sp")
public String importExcelThrow_in_sp(String fileName) {
IOUtils.setByteArrayMaxOverride(200000000);
fileName="C:\\Users\\admin\\Desktop\\SP(2).xlsx";
if (fileName == null && "".equals(fileName)) {
return "文件名不能为空!";
} else {
if (fileName.endsWith("xls") || fileName.endsWith("xlsx")) {
Boolean isOk = throwInSpService.importExcelThrow_in_sp(fileName);
if (isOk) {
return "导入成功!";
} else {
return "导入失败!";
}
}
return "文件格式错误!";
}
}
}
我想在前端写一个点击上传文件之后,把路径传过来应该怎么写
三种方式:
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.Locale;
import java.util.UUID;
@RestController
@RequestMapping("upload")
public class UploadController {
/**
* 上传方式一,从请求体中获取文件信息
* @param request
* @return
* @throws IOException
*/
@PostMapping("method1")
public String upload1(HttpServletRequest request) throws IOException {
MultipartFile file = ((StandardMultipartHttpServletRequest) request).getFile("file");
String fileName = file.getOriginalFilename();
String newName=UUID.randomUUID().toString()+fileName.substring(fileName.indexOf("."));
// 获取当前操作系统
String osName = System.getProperties().get("os.name").toString().toLowerCase(Locale.ROOT);
String path="";
if(osName.startsWith("win")){
path="D:\\Test\\";
}else{
path="/mnt/test";
}
File saveFile=new File(path+newName);
if(!saveFile.getParentFile().exists()){
saveFile.getParentFile().mkdirs();
}
// 设置文件权限时需先创建文件
// saveFile.createNewFile();
file.transferTo(saveFile);
// 文件权限
// fileAuth(saveFile.toPath());
return saveFile.getPath();
}
/**
* 上传方式2 MultipartFile 上传
* @param file
* @return
* @throws IOException
*/
@PostMapping("method2")
public String upload2(@RequestParam("file") MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename();
String newName=UUID.randomUUID().toString()+fileName.substring(fileName.indexOf("."));
// 获取当前操作系统
String osName = System.getProperties().get("os.name").toString().toLowerCase(Locale.ROOT);
String path="";
if(osName.startsWith("win")){
path="D:\\Test\\";
}else{
path="/mnt/test";
}
File saveFile=new File(path+newName);
if(!saveFile.getParentFile().exists()){
saveFile.getParentFile().mkdirs();
}
file.transferTo(saveFile);
return saveFile.getPath();
}
/**
* base64 图片上传
* @param base64
* @return
*/
@PostMapping("method3")
public String upload3(@RequestParam("base64")String base64){
String base64Data = base64.split(",")[1];
Base64.Decoder decoder = Base64.getDecoder();
byte[] bytes = decoder.decode(base64Data);
// 获取当前操作系统
String osName = System.getProperties().get("os.name").toString().toLowerCase(Locale.ROOT);
String path="";
if(osName.startsWith("win")){
path="D:\\Test\\";
}else{
path="/mnt/test";
}
String newName=UUID.randomUUID().toString()+".png";
File saveFile=new File(path+newName);
if(!saveFile.getParentFile().exists()){
saveFile.getParentFile().mkdirs();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(saveFile);
fos.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return saveFile.getPath();
}
/**
* 文件上传到linux权限处理
* @throws Exception
*/
private static void fileAuth(Path path) throws Exception {
Set perms = Files.readAttributes(path, PosixFileAttributes.class).permissions();
// 当前用户权限
/*perms.add(PosixFilePermission.OWNER_WRITE);
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_EXECUTE);
// 组权限
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_EXECUTE);*/
// 其它权限
perms.add(PosixFilePermission.OTHERS_WRITE);
perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_EXECUTE);
Files.setPosixFilePermissions(path, perms);
}
public static void main(String[] args) {
String data = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAFJklEQVR4Xu3VsRGAQAwEsaf/oqEBINj0RO7A8u9w3efcx0eAwKvAJRAvg8C3gEC8DgI/AgLxPAgIxBsg0AT8QZqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaERDIyKGt2QQE0txMjQgIZOTQ1mwCAmlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk1AIM3N1IiAQEYObc0mIJDmZmpEQCAjh7ZmExBIczM1IiCQkUNbswkIpLmZGhEQyMihrdkEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaERDIyKGt2QQE0txMjQgIZOTQ1mwCAmlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk1AIM3N1IiAQEYObc0mIJDmZmpEQCAjh7ZmExBIczM1IiCQkUNbswkIpLmZGhEQyMihrdkEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaERDIyKGt2QQE0txMjQgIZOTQ1mwCAmlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk1AIM3N1IiAQEYObc0mIJDmZmpEQCAjh7ZmExBIczM1IiCQkUNbswkIpLmZGhEQyMihrdkEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaERDIyKGt2QQE0txMjQgIZOTQ1mwCAmlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk1AIM3N1IiAQEYObc0mIJDmZmpEQCAjh7ZmExBIczM1IiCQkUNbswkIpLmZGhEQyMihrdkEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIwAOn4Y9IyHT+ZAAAAABJRU5ErkJggg==";
}
}
不建议这么做,本地文件无法获取路径,建议上传文件,可以把文件接收后临时存储到哪里,再读取文件获取文件里面的内容,代码执行完成后,不需要文件再删除即可
前端通过文件上传输入框,可以将文件以流的方式传递到后端,后端使用MulitipartFile接收到文件对象,可以读取文件内容,将其保存到服务器的某个目录下面。
不知道你这个问题是否已经解决, 如果还没有解决的话: <el-upload
:on-error="uploadError"
:accept="accept"
class="uploadContent"
:action="uploadurl"
:on-remove="handleRemove"
:before-remove="beforeRemove"
multiple
:limit="limit"
ref="uploadComponent"
:on-exceed="handleExceed"
:auto-upload="autoupload"
:file-list="fileList"
:data="uploadData"
:on-change="fileStateChange"
:http-request="handleupload"
>
<span v-if="showtip">添加附件</span>
<el-button class="btnColor2" size="small" type="primary">添加附件 </el-button>
</el-upload>
代码解读:上述代码采用了element-ui的el-upload文件上传的组件。改组件有两种文件上传的方式:
1.组件自带的上传方法,只需要给其设置action地址参数,即可完成上传,但是其弊端为无法在改组件的基础上设置后端相应的数据格式:responseType,或者是拿到后端响应的二进制流后将其转换为blob对象并为其设置responseType:'blob'无效的问题,从而导致导出的excl文件打开后为乱码的问题。
2.:http-request自定义上传方法。改方法也是本次主要的上传方法,此处使用自定义方法上传的有点便是可自定义上传接口的参数,上代码:
定义接口:
// 文件上传
export const userNameListUpload = (data, uploadurl) => axios.request({
url: uploadurl,
baseURL,
data,
method: 'post',
contentType: 'application/json;charset=UTF-8',
responseType: 'blob',
});
上述代码引用接口:userNameListUpload,在该接口的axios部分需要设置一下参数:
contentType: 'application/json;charset=UTF-8',
responseType: 'blob',
其含义是指定后端相应的数据类型为blob类型。
:http-request自定义上传函数:
async handleupload(option) {
const formData = new FormData();
if (option.data) {
Object.keys(option.data).forEach((key) => {
formData.append(key, option.data[key]);
});
}
formData.append(option.filename, option.file, option.file.name);
const loading = this.$loading({ text: '上传中...' });
const res = await userNameListUpload(formData, this.uploadurl);
loading.close();
if (res) {
this.$emit('uploadComplete', res); // 展示导入结果
}
},
前端在拿到后盾响应的数据后,只需将其转换为Blob对象,然后再以a标签的形式进行访问即可,上代码:
// 展示失败明细
falidDetail() {
// 有Success的直接展示
if (this.sendResponse.Success) {
if (this.sendResponse.Success) {
this.$message.success(this.sendResponse.Msg);
} else {
this.$message.error(this.sendResponse.Msg);
}
} else {
//=========================进行流转换为excel表格的操作,并导出excel===============
// 没有Success的直接展示ecxel表格
const blob = new Blob([this.sendResponse]);
const link = document.createElement('a');
link.style.display = 'none';
// setAttribute() 方法添加指定的属性,并为其赋指定的值。
link.setAttribute('download', '错误信息.xlsx');
link.href = window.URL.createObjectURL(blob);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(blob);
}
},
进行了这些设置后,即可正常导出excel文件了。
每一次解答都是一次用心理解的过程,期望对你有所帮助。
参考结合AI智能库,如有帮助,恭请采纳。
是的,可以直接上传包含绝对路径的Excel文件。可以使用HTML的元素让用户选择要上传的文件,然后使用JavaScript或jQuery来获取文件路径。以下是一个基本的示例:
<form id="upload-form">
<input type="file" id="file-input" />
<button type="submit">上传</button>
</form>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
$('#upload-form').submit(function(event) {
event.preventDefault();
var fileName = $('#file-input').val();
$.ajax({
url: '/importExcelThrow_in_sp',
type: 'GET',
data: { fileName: fileName },
success: function(response) {
console.log(response); // 处理成功或失败的逻辑
},
error: function(xhr, status, error) {
console.error(error); // 处理错误逻辑
}
});
});
});
</script>
和正常的请求一样的
java后端代码
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AController {
@Autowired
Throw_in_spService throwInSpService;
@GetMapping("/importExcelThrow_in_sp")
public String importExcelThrow_in_sp(@RequestParam String fileName) {
if (fileName == null && "".equals(fileName)) {
return "文件名不能为空!";
} else {
if (fileName.endsWith("xls") || fileName.endsWith("xlsx")) {
Boolean isOk = throwInSpService.importExcelThrow_in_sp(fileName);
if (isOk) {
return "导入成功!";
} else {
return "导入失败!";
}
}
return "文件格式错误!";
}
}
}
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.6.0/jquery.min.js"
type="application/javascript"></script>
</head>
<body>
<input id="test01">
<button onclick="upload()">提交</button>
</body>
<script type="application/javascript">
function upload() {
$.get('/importExcelThrow_in_sp', {fileName: $('#test01').val()}, console.log)
}
</script>
</html>
那就要自定义组件了,把路径当参数传过去
在springboot中可以使用以下的代码实现:
/**
* 通用上传请求(单个)
*/
@PostMapping("/upload")
@ResponseBody
public AjaxResult uploadFile(MultipartFile file) throws Exception
{
try
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileName;
AjaxResult ajax = AjaxResult.success();
ajax.put("url", url);
ajax.put("fileName", fileName);
ajax.put("newFileName", FileUtils.getName(fileName));
ajax.put("originalFilename", file.getOriginalFilename());
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
你需要先初始化,
File file = new File(filePath);
if (!file.exists()) {
return "文件不存在!";
} else if (file.isDirectory()) {
return "不能处理文件夹!";
} else if (file.isFile()) {
String fileName = file.getName();
if (fileName.endsWith("xls") || fileName.endsWith("xlsx")) {
try {
// 处理文件上传逻辑,调用throwInSpService.importExcelThrow_in_sp方法
Boolean isOk = throwInSpService.importExcelThrow_in_sp(file);
if (isOk) {
return "导入成功!";
} else {
return "导入失败!";
}
前端传入路径,后端通过路径解析文件并将excel导入至数据库
那代表前端只需要正常的请求就行,get/post无所谓,也不需要变更请求格式 application/json即可
后端接口,按照您现在接口写入,可正常接受路径。
需要变更的地方,在importExcelThrow_in_sp的第12行开始,你需要通过文件路径读取文件流信息
参考代码如下
FileInputStream in = new FileInputStream("C:\Users\admin\Desktop\SP(2).xlsx");
然后通过easyexcel组件进行excel导入,参考文章https://blog.csdn.net/qq_49195366/article/details/127394595即可
导入成功后即可正常转为对象/集合
但是这种通过路径导入的方式很鸡肋,如果服务读端和当前导入路径不在同一个服务器上,则无法读取到文件信息(这种方式不可能完成),如果答案对博主有帮助,麻烦采纳谢谢
在进行Excel的上传过程中,一般有两种上传方式:1.使用相对路径上传 2.使用绝对路径上传。在这里,我们着重介绍使用绝对路径上传的方法。
绝对路径是指文件在磁盘中的完整路径,包括磁盘名称、文件夹路径和文件名。使用绝对路径上传,在上传文件时需要在代码中明确指定文件的完整路径,这样程序才能读取到正确的文件。
下面介绍使用绝对路径进行Excel上传的具体步骤:
1.获取文件的完整路径
首先需要获取Excel文件的完整路径。在Windows系统中,可以通过文件资源管理器来获取文件路径。选中相应的文件,右键点击“属性”,进入属性窗口,选择“常规”选项卡中的“位置”一栏,即可看到文件的完整路径。
2.将文件路径保存到代码中
在代码中,将获取到的文件路径保存在一个变量中。一般情况下,可以将路径保存在字符串类型的变量中。
例如,可以这样定义一个变量:
string FilePath = @"C:\Users\Administrator\Desktop\ExcelFile.xlsx";
3.使用文件流读取Excel文件
使用C#的文件流(FileStream)类来读取Excel文件。文件流类可以通过文件路径来创建一个实例,这个实例可以被用来读取Excel文件。
例如,可以这样创建一个文件流:
FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
这里的参数含义分别是:FilePath-文件路径,FileMode.Open-打开文件,FileAccess.Read-访问文件的权限是读。
4.使用ExcelDataReader读取Excel文件
使用ExcelDataReader库来读取Excel文件。ExcelDataReader是一个用于读取Excel文件的开源库,使用它可以读取Excel文件中的数据,并将数据存储在DataSet中。
例如,可以这样读取Excel文件:
//创建一个ExcelDataReader对象
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(fs);
//将Excel数据存储在DataSet中
DataSet result = excelReader.AsDataSet();
//关闭文件流
excelReader.Close();
5.遍历并处理Excel数据
将Excel中的数据存储在DataSet中后,就可以对数据进行遍历并进行处理了。可以使用C#中的for循环、foreach循环等方式来遍历DataSet中的数据,并对数据进行处理。
例如,可以这样遍历DataSet中的数据:
//遍历DataSet并输出数据
foreach(DataTable table in result.Tables)
{
foreach(DataRow row in table.Rows)
{
foreach(DataColumn column in table.Columns)
{
Console.Write(row[column].ToString() + "\t");
}
Console.WriteLine();
}
}
6.完成Excel的上传
在数据处理完成后,可以将数据上传到服务器或者保存到本地文件中。
例如,可以这样上传Excel数据:
//上传Excel数据
byte[] buffer = System.IO.File.ReadAllBytes(FilePath);
using(var client = new System.Net.WebClient())
{
client.UploadData("http://yourwebsite.com/upload.aspx", "POST", buffer);
}
以上就是使用绝对路径进行Excel上传的详细介绍。需要注意的是,在上传Excel文件时,需要先检查上传文件的格式和大小是否符合要求,并且在使用文件流读取文件时,要保证文件不存在空值或者格式异常等情况,以免出现错误。
上传Excel文件时,通常有两种方式:一种是通过本地文件选择对话框,选择需要上传的文件;另一种是通过绝对路径指定文件的位置。在这里,我们将介绍绝对路径的使用。
绝对路径是指文件在计算机中的具体位置,它包含了完整的路径地址。绝对路径是相对于整个磁盘的根目录而言的,与当前文件所在的目录位置无关。因此,使用绝对路径时,可以直接指定Excel文件在计算机中的位置,而无需在本地进行文件选择。
在使用绝对路径前,需要了解Excel文件的存储路径。Excel文件通常存储在计算机硬盘的某个目录下,可通过“我的电脑”或“文件资源管理器”等文件系统窗口找到。
接下来,我们通过以下步骤演示如何通过绝对路径上传Excel文件:
打开要上传Excel文件的目录,找到该文件的完整路径。例如,C:\Users\Administrator\Desktop\test.xlsx。
在程序代码中,使用文件上传控件(例如HTML中的)或其他方式实现文件上传功能。
在上传功能的处理程序中,获取Excel文件的完整路径。例如,在ASP.NET中,可以使用Server.MapPath()方法获取Web应用程序的物理路径。示例代码如下:
string filePath = Server.MapPath(@"C:\Users\Administrator\Desktop\test.xlsx");
需要注意的是,使用绝对路径上传Excel文件时,需要保证上传的文件路径是正确的。如果文件路径错误或不存在,则上传功能将无法正常工作。此外,由于绝对路径具有固定的位置,因此无法移植到其他计算机上。因此,在实际应用中,建议使用相对路径实现文件上传功能,以确保程序的可移植性和可维护性。
综上所述,上传Excel可以通过绝对路径直接传文件路径,但需要注意文件路径的正确性和可维护性。如果使用相对路径实现文件上传,则可以避免这些问题。
用隐藏域啊,input type='file'正常选择文件,选完之后路径赋给一个input type='hidden',给后台传hidden这个