java接收,操作csv文件

先简单的贴下前端代码:

 <div class="row">
    <div class="col-sm-3 col-sm-offset-2">
      <span>3.点击按钮上传文件</span>
    </div>
    <div class="col-sm-3 ">
      <input type="button" id="upload" onclick="UpladFile()" class="btn btn-primary" value="上传"/>
      <input type="button" id="cancel" style="float: right" class="btn btn-primary" onclick="cancleUploadFile()"
             value="取消"/>
    </div>
  </div>
<script>
      // 上传文件方法
  function UpladFile() {
    $('#upload').prop("disabled", "disabled")
    $('#upload').val("正在上传中,请勿下载")
    $('#cancel').prop("disabled", "disabled")
    var fileObj = document.getElementById("file").files[0]; // js 获取文件对象
    var project = $('#project_id option:selected').val();
    var url = "/file/uploadFile"; // 接收上传文件的后台地址

    var form = new FormData(); // FormData 对象
    form.append("file", fileObj); // 文件对象
    form.enctype = "multipart/form-data"

    xhr = new XMLHttpRequest();  // XMLHttpRequest 对象
    xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。
    xhr.onload = uploadComplete; //请求完成
    xhr.onerror = uploadFailed; //请求失败
    xhr.upload.onprogress = progressFunction;//【上传进度调用方法实现】
    xhr.upload.onloadstart = function () {//上传开始执行方法
      ot = new Date().getTime();   //设置上传开始时间
      oloaded = 0;//设置上传开始时,以上传的文件大小为0
    };

    xhr.send(form); //开始上传,发送form数据
  }
</script>

流程:构造formData对象,enctype="multipart/form-data"这样设置。

后台:在springMVC的配置文件里面配置处理器:

  <!--配置MultipartResolver处理文件-->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="5400000" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>

maxUploadSize:最大上传大小;defaultEncoding:这里可设置编码

controller用到的jar包:


<dependency>
		    <groupId>net.sourceforge.javacsv</groupId>
		    <artifactId>javacsv</artifactId>
		    <version>2.0</version>
		</dependency> 
@Controller
@RequestMapping("file")
public class FileController {

    private static final String UPLOAD_DIRECTORY = "D:/app/";

    private static Logger LOG = Logger.getLogger(FileController.class);

    @Autowired
    private PCUserDaoImpl userDao;

    @RequestMapping(value = "uploadFile", method = RequestMethod.POST)
    public void uploadFile(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
        // 判断文件是否为空
        request.setCharacterEncoding("gb2312");
        if (!file.isEmpty()) {
            try {
                //判断文件目录是否存在,否则自动生成
                File directory = new File(UPLOAD_DIRECTORY);
                if (!directory.exists()) {
                    directory.mkdirs();
                }
                if (file.getSize() > 30000) {
                    BasicVo vo = new BasicVo();
                    vo.put("code", Result.ERROR);
                    vo.put("message", "文件太大,接收失败");
                }
                // 文件保存路径
                String filePath = UPLOAD_DIRECTORY + new Date().getTime() + file.getOriginalFilename();
                // 转存文件
                file.transferTo(new File(filePath));

                File csv = new File(filePath);  // CSV文件路径
              
                String line = "";
                String everyLine = "";

                BufferedReader br = null;
                br = new BufferedReader(new FileReader(csv));
              
               //构造csvwriter
                CsvWriter csvWriter = new CsvWriter(csv.getCanonicalPath(), ',', Charset.forName("GB2312"));

                //读取到的内容给line变量
                while ((line = br.readLine()) != null) {
                    everyLine = line;
                    System.out.println(new String(everyLine.getBytes(), "GB2312"));
                    //如果是第一行
                    if (everyLine.contains("name")) {
                        //给表头添加用户名,密码
                        everyLine = new StringBuffer(everyLine).append(",用户名").append(",密码").toString();
                        String[] headers = everyLine.split(",");
                        csvWriter.writeRecord(headers);
                        System.out.println("设置表头结束");
                        continue;
                    }
                   
                        String[] content = everyLine.split(",", -1);
                        //写入每行数据到csv文件
                        for (String str : content) {
                            csvWriter.write(str);
                        };
                        //添加用户名和密码
                        csvWriter.write(setMemberBaseInfo.getUsername());
                        csvWriter.write(nPsw.toString());
                        //结束一行内容
                        csvWriter.endRecord();
                    } catch (Exception e) {
                        System.out.println("异常" + e);
                        LOG.error(e);
                    }

                }
                //结束写入操作
                csvWriter.close();
                response.getWriter().print("success,"+csv.getName());
            } catch (Exception e) {
                LOG.error(e.getMessage());
            }
        }
    }

在读写文件的时候遇到几个坑:

1.编码的问题,开始传输的csv文件以及后台所有的编码 我都采用utf-8编码;可以读出中文,但是依旧会出现“?”以及内容缺失,前端传输的csv文件以及后台I/O操作都采用GB2312的方式处理,就没出现乱码的问题了。

2.split的用法踩坑:

 private static void testSplit() {
        String ss = ",aa,bb,cc,dd,,,";
        String[] array = ss.split(",");
 
        System.out.println(array.length);//结果是5,而不是预想中的8
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }

后面的逗号之间的空格被忽略了,只是处理后面尾部的空字符串,不处理中间的空字符串和 开头的空字符串。

后面采用了str.split(String regex,int limit)这种方式,limit参数代表分割作用的次数, limit为   -1   的话  ,就可以解决上面那种不处理中间的空字符串的问题,或者limit = 100(比较大的值);

Java中,我们可以通过使用文件过滤器来接收多个文件类型。 文件过滤器是一个接口,它定义了一个用于过滤文件的方法accept。我们可以通过实现该接口的方式来自定义文件过滤器,根据我们的需要来接收多个文件类型。 下面是一个示例代码,演示了如何使用文件过滤器接收多个文件类型: ```java import java.io.File; import java.io.FileFilter; public class MultiFileTypeFilter implements FileFilter { private String[] allowedExtensions; // 存储允许的文件类型 public MultiFileTypeFilter(String... allowedExtensions) { this.allowedExtensions = allowedExtensions; } @Override public boolean accept(File file) { // 检查文件的扩展名是否存在于允许的文件类型列表中 String fileName = file.getName(); int dotIndex = fileName.lastIndexOf('.'); if (dotIndex != -1 && dotIndex < fileName.length() - 1) { String extension = fileName.substring(dotIndex + 1); for (String allowedExtension : allowedExtensions) { if (extension.equalsIgnoreCase(allowedExtension)) { return true; } } } return false; } public static void main(String[] args) { File dir = new File("path/to/directory"); // 要扫描的文件夹路径 String[] allowedExtensions = {"txt", "csv", "xml"}; // 允许接收文件类型 MultiFileTypeFilter filter = new MultiFileTypeFilter(allowedExtensions); // 遍历文件夹下的所有文件,并使用文件过滤器接收指定类型的文件 File[] files = dir.listFiles(filter); for (File file : files) { System.out.println(file.getName()); } } } ``` 在上述代码中,我们首先定义了一个MultiFileTypeFilter类,它实现了FileFilter接口,并重写了accept方法。在accept方法中,我们通过获取文件扩展名,然后检查该扩展名是否存在于允许的文件类型列表中,来决定是否接收文件。 在main方法中,我们可以通过指定文件夹路径和允许的文件类型来创建一个MultiFileTypeFilter对象。然后,通过调用listFiles方法来获取指定文件夹下满足过滤条件的文件列表。 上述示例代码可以根据需要进行修改,以满足您对多个文件类型接收的具体要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_40249994

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值