• python学习之文本文件上传


    最近用python的flask框架完成了一个最基本的文本文件上传,然后读取。

    前端用的Angular的ng2-file-upload完成文件上传,后端用flask接收上传的文件,接着做处理。

    在交互的过程中发现,当文本的编码格式不是UTF-8的时候(python3 默认的编码是UTF-8),会产生decode错误。

    错误信息:

    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 0: invalid continuation byte

    解决办法如下:

    files = request.files['file'].read()
    files_charset = chardet.detect(files)# 获取文件的编码格式
    article = files.decode(files_charset['encoding'])# 按照文件的的编码格式读取文件内容

    前端Angular的ts如下:

    import { Component, OnInit } from '@angular/core';
    import { FileUploader } from 'ng2-file-upload';
    import {Router} from '@angular/router';
    import {HttpClient, HttpHeaders} from '@angular/common/http';
    import {Observable} from 'rxjs/Observable';
    
    @Component({
      selector: 'app-file',
      templateUrl: './file.component.html',
      styleUrls: ['./file.component.scss']
    })
    export class FileComponent implements OnInit {
      info = '点击这里选择文件';
      formData = new FormData();
      dataSource: Observable<any>;
      uploader: FileUploader = new FileUploader({url: '/api/file'});
      constructor( private router: Router, private http: HttpClient ) { }
    
      ngOnInit() {
      }
      selectedFileOnChanged(event) { // 单文件上传,选择文件后显示文件名
        if ( this.uploader.queue.length > 0 ) {
          const file = this.uploader.queue[0]._file;
          const fileName = this.uploader.queue[0]._file.name;
          this.formData.append('file', file, fileName);
          if ( fileName == '' ) {
            this.info = '点击这里选择文件';
          } else {
            this.info = fileName;
          }
        } else {
          this.info = '点击这里选择文件';
        }
      }
      submit() {// 上传文件
        const headers = new HttpHeaders();
        headers.set('Content-Type', 'multipart/form-data');// 上传类型为文件
        headers.set('Accept', 'application/json');// 接收json文件
        this.dataSource = this.http.post('/api/file', this.formData, { headers: headers} );
        this.dataSource.subscribe( data =>{
          console.log(data);//接收数据 
        });
      }
      destroy() {// 清空文件缓存
        this.uploader.clearQueue();
      }
    }

    前端HTML页面如下:

    <div class="row" xmlns="">
      <div class="col-md-12">
        <nb-card>
          <nb-card-header>
            <h4>选择需要分析的文件:</h4>
          </nb-card-header>
          <nb-card-body>
            <div class="row high" ngForm>
              <div class="col-md-3 col-lg-3 col-sm-3">
                <a href="javascript:void(0);" class="file btn btn-hero-success btn-sm" (click)="destroy()">
                  <input type="file" ng2FileSelect [uploader]="uploader" 
              (change)
    ="selectedFileOnChanged($event)" accept=".pdf,.doc,.docx,.txt"
              name
    ="file" /> {{ info }} </a> </div> <div class="col-md-2 col-lg-2 col-sm-2"> <button type="submit" class="btn btn-hero-success btn-sm" (click)="submit()">提交文件</button> </div> <div class="col-md-7 col-lg-7 col-sm-7"> <span class="tip">提示:单文件分析,可传doc,docx,pdf,txt等文本文件。</span> </div> </div> </nb-card-body> </nb-card> </div> <router-outlet></router-outlet> </div>
  • 相关阅读:
    visual studio 2010 在使用带namespace友元模板函数声明时的bug
    Windows同步对象Event和Linux的条件变量
    从密码学角度看TX常用的TEA加密算法
    SHA1和MD5算法详解和源码
    java 运行机制和环境搭建学习 java 归纳(1)
    循环结构学习 java 归纳(3)
    数组学习 java 归纳(4)
    条件选择结构学习 java 归纳(2)
    JavaWeb 参数
    新博客
  • 原文地址:https://www.cnblogs.com/Asimple/p/8743926.html
Copyright © 2020-2023  润新知