使用 <input type=file> 上传图像和文本文件,然后在文档中显示它们

Upload Images and Text Files using <input type=file> then showing them within document

我想制作一个文件输入,您可以在其中输入 select 图像,然后它会显示在特定的 div 中。我已经尝试了一些我见过的方法并且我过去也这样做过但我不记得......我也想用文本文档来做,只是显示没有 iframe 或任何东西的文本。

有什么指点吗?

只是想让你知道我想放入本地文件,它只需要在 chrome 中工作。

$(document).ready(function(){

     $('input.upload').on('change', addFile);
    
});

     function addFile (event) {

        var jqDisplay = $('div.myTarget');
        var reader = new FileReader();
        var selectedFile = event.target.files[0];

        reader.onload = function (event) {
            var imageSrc = event.target.result;
            jqDisplay.html('<img src="' + imageSrc + '" alt="uploaded Image">');
        };
       reader.readAsDataURL(selectedFile); 
    }
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
</head>
<body>

  <div class="myTarget"></div>
  <input type="file" class="upload">

</body>
</html>

嗯,它是基于javascript处理上传的方法,所以在angular2中,我使用打字稿按以下方式上传图像。输入类型文件是这里的关键。

src 由 属性 绑定,当我向他发送图像 url 时,其值在代码中设置为服务器响应提供的返回 aws s3 url保存它。

html :-

<div class="mt-10 fileUpload">
          <label class="uploadBtnLabel bm-action-btn">
            <input type="file" name="resourceFile" #uploadElem accept="image/*" (change)="uploadImage(submitElem)"/>
            <input type = "submit" id="fileUpload" class="hidden" name="fileUpload" #submitElem (click)="store.postFileUpload(uploadElem, group)">
            <span>Upload<i class=" pl-5 fa fa-upload"></i></span>
          </label>
        </div>

<img class="logoImage" [src]="group.controls['logoUrl'].value" *ngIf="group.controls['logoUrl'].value">

typescript 函数同样将图像转换为 dataUrl 并将其发送到服务器。

//Function to upload local file
    uploadImage(submitElem, renderer){
        let event = new MouseEvent('click', {bubbles: false});
        renderer.invokeElementMethod(
          submitElem, 'dispatchEvent', [event]);
      }

  postFileUpload(inputValue, group){
    this.readImage(inputValue, group);
  }

  readImage(inputValue: any, group): void {
    if(inputValue) {
      let image;
      let self = this;
      let accountId;
      var file: File = inputValue.files[0];
      var myReader: FileReader = new FileReader();
      myReader.readAsDataURL(file)
      myReader.onloadend = (e) => {
        image = myReader.result.split(',')[1];
        let postData = {
          imageString: image
        };
        if(group.controls['accountId']) {
          accountId = group.controls['accountId'].value;
        }else{
          accountId = self.mssId;
        }
        self.imageUploadSub = self.invoiceConfService.uploadImage(accountId, postData).subscribe(
          (response) => {
            group.controls['logoUrl'].setValue(response.data.logoUrl);
            self.imageLink = response.data.logoUrl;
          },
          (error) => {
          });
      }
    }
  }

您不需要使用 FileReader 来显示用户上传的文件。
readAsDataURL 比较宽泛。它会强制您直接在 HTML 标记中保留原始文件大小的 130%,因此,它会大大增加您的内存消耗。

相反,在处理用户上传的文件时,您应该始终首选 URL.createObjectURL 方法。这只会存储指向用户系统上文件的直接指针,以及 returns 一个小 URI:内存影响几乎为零。

但是,您声明不想使用 iframe,这很不幸,因为它是唯一可以显示来自 html 页面的文本文件的元素之一。
因此,对于这种情况,您将不得不使用 FileReader,但使用 readAsText() 方法。

这是一个简单的通用媒体播放器:

f.onchange = function(e) {
  let file = this.files[0];
  let elementType;
  // this is really naïve, the MIME type means nothing and should not be trusted
  let fileType = file.type.split('/')[0];
  switch (fileType) {
    // determine which element to create
    case 'image': elementType = 'img'; break;
    case 'video': elementType = 'video'; break;
    case 'audio': elementType = 'audio'; break;
    case 'text': // this one may break and should not be there
      elementType = 'pre';
      break;
    default: // We'll use an iframe for unknow elements
      elementType = 'iframe'; break;
  }

  let elem = document.createElement(elementType);
  if (elementType !== 'pre') { // a real media
    // not really needed here,
    // but it's always good to revoke a blobURI when not needed anymore
    elem.onload = e=> { URL.revokeObjectURL(elem.src) };

    elem.src = URL.createObjectURL(file);
    if(elementType === 'audio' || elementType === 'video'){
      elem.controls = true;
      }
  } else {
    // so we said we wanted to display text files inside the current document ...
    let reader = new FileReader();
    reader.onload = function() {
      elem.textContent = reader.result;
    };
    reader.readAsText(file);
  }
  document.body.appendChild(elem);
}
iframe {
  border: none;
}
<input type="file" id="f">