上传EXCEL可以直接传绝对路径吗


 @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接收到文件对象,可以读取文件内容,将其保存到服务器的某个目录下面。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7784986
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:亿级电商微信小程序流量实战系列之如何使用云开发导出订单信息至excel文件?
  • 您还可以看一下 吴开斌老师的Excel 打造中小型企业人力资源管理员工信息系统 人事管理表课程中的 解决文件路径改变的问题小节, 巩固相关知识点
  • 除此之外, 这篇博客: 解决前端导出excel文件,打开为乱码中的 方案一:用户自定义上传方法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
        <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文件:

  1. 打开要上传Excel文件的目录,找到该文件的完整路径。例如,C:\Users\Administrator\Desktop\test.xlsx。

  2. 在程序代码中,使用文件上传控件(例如HTML中的)或其他方式实现文件上传功能。

  3. 在上传功能的处理程序中,获取Excel文件的完整路径。例如,在ASP.NET中,可以使用Server.MapPath()方法获取Web应用程序的物理路径。示例代码如下:

string filePath = Server.MapPath(@"C:\Users\Administrator\Desktop\test.xlsx");

  1. 将获取到的Excel文件路径传递给Excel处理程序,实现对Excel文件的读取或写入操作。

需要注意的是,使用绝对路径上传Excel文件时,需要保证上传的文件路径是正确的。如果文件路径错误或不存在,则上传功能将无法正常工作。此外,由于绝对路径具有固定的位置,因此无法移植到其他计算机上。因此,在实际应用中,建议使用相对路径实现文件上传功能,以确保程序的可移植性和可维护性。

综上所述,上传Excel可以通过绝对路径直接传文件路径,但需要注意文件路径的正确性和可维护性。如果使用相对路径实现文件上传,则可以避免这些问题。

用隐藏域啊,input type='file'正常选择文件,选完之后路径赋给一个input type='hidden',给后台传hidden这个