当前位置: 首页 > 知识库问答 >
问题:

循环浏览多个图像数组以单独上传到AWS s3 ReactJS

柳经纶
2023-03-14

我正在构建一个上传页面,该页面应该可以拍摄多幅图像,并使用aws amplify storage将其上传到aws s3。

我有一些问题

>

  • 我需要在上传之前将所有图像编码为base64格式。

    它一次只允许上传一个图像,所以我需要遍历文件数组并分别上传每个文件。

    我无法使用文件获取文件名。名称。

    我应该如何循环遍历图像文件数组,在base64中对它们进行编码,并分别上载每个文件?

    下面的代码用于一次上载一个图像,但文件名未定义。

     const file = useRef(null);
    
     function handleFileChange(event) {
    
            file.current = btoa(event.target.files); 
    
       console.log(event.target.files) ///// length: 7
                               /// 0: File {name: "921 crest road (19 of 91).jpg", lastModified: 1579836842179, lastModifiedDate: Thu Jan 23 2020 22:34:02 GMT-0500 (Eastern Standard Time), webkitRelativePath: "", size: 13998488, …}
                              /// 1: File {name: "921 crest road (20 of 91).jpg", lastModified: 1579836859659, lastModifiedDate: Thu Jan 23 2020 22:34:19 GMT-0500 (Eastern Standard Time), webkitRelativePath: "", size: 14433420, …}
                             /// 2: File {name: "921 crest road (21 of 91).jpg", lastModified: 1579836860868, lastModifiedDate: Thu Jan 23 2020 22:34:20 GMT-0500 (Eastern Standard Time), webkitRelativePath: "", size: 14524865, …}
                            /// 3: File {name: "921 crest road (22 of 91).jpg", lastModified: 1579836861497, lastModifiedDate: Thu Jan 23 2020 22:34:21 GMT-0500 (Eastern Standard Time), webkitRelativePath: "", size: 13995939, …}
                           /// 4: File {name: "921 crest road (23 of 91).jpg", lastModified: 1579836884687, lastModifiedDate: Thu Jan 23 2020 22:34:44 GMT-0500 (Eastern Standard Time), webkitRelativePath: "", size: 13982365, …}
                          /// 5: File {name: "921 crest road (24 of 91).jpg", lastModified: 1579836885360, lastModifiedDate: Thu Jan 23 2020 22:34:45 GMT-0500 (Eastern Standard Time), webkitRelativePath: "", size: 14288288, …}
                         /// 6: File {name: "921 crest road (25 of 91).jpg", lastModified: 1579836886846, lastMod
    
                console.log(file.current) //// undefined
      }
    
    
        async function handleSubmit(event) {
            event.preventDefault();
            setShowLoading(true);
    
        try {
    
                console.log(file.name) ///undefined
    
                const filename = `${job.jobId}---${file.name}`;
    
                const stored = await Storage.put(filename, file.current, {
                    contentType: file.type
            });
    
             } catch (e) {
                alert(e);
                console.log(e.message)
                }
             setShowLoading(false);
        }
    
    
    
      var centerText = {textAlign: "center"}
    
      return(
          <IonPage>
          <IonHeader>
            <IonToolbar>
          <IonButtons slot="start">
              <IonBackButton/>
            </IonButtons>
              <IonTitle>Upload Images</IonTitle>
            </IonToolbar>
          </IonHeader>  
          <IonContent className="ion-padding">
    
          <form onSubmit={handleSubmit}>
    
          <input multiple="true" type="file" onChange={(e) => handleFileChange(e)}></input>
          <IonButton  expand="block" color="primary" strong="true" size="default" type="submit" >Upload</IonButton>
    
          </form>
    
        </IonContent>
        </IonPage>
        );
    
    
      }
    
    
    export default withRouter(JobInfo);
    

    更新代码-仍然不工作!

    const file = useRef(null);
    
      function extractInfo(file) {
            console.log(file)
         return { 
          name: file.name,
          type: file.type,
          content: btoa(file.content),
       };
    
    }
    
        async function handleFileChange(event) {
        file.current = event.target.files;
    
      }
    
        async function handleSubmit(event) {
       const result = await Promise.all(
          file.current.files
              .map(extractInfo)
              .map(uploadFile)
       );
            console.log(file.files)
        }
    
    
        async function uploadFile(file) {
    
             setShowLoading(true);
    
            try {
    
      const filename = `${job.jobId}-${file.name}`;
    
      const stored = await Storage.put(filename, file.current, {
        contentType: file.type
      });
    
    
      } catch (e) {
        alert(e);
        console.log(e.message)
    
      }
     setShowLoading(false);
    }
      var centerText = {textAlign: "center"}
    
      return(
          <IonPage>
          <IonHeader>
            <IonToolbar>
          <IonButtons slot="start">
              <IonBackButton/>
            </IonButtons>
              <IonTitle>Upload Images</IonTitle>
            </IonToolbar>
          </IonHeader>  
          <IonContent className="ion-padding">
    
          <form onSubmit={handleSubmit}>
    
           <input multiple type="file" ref={file} onChange={(e) => handleFileChange(e)}></input></input>
          <IonButton  expand="block" color="primary" strong="true" size="default" type="submit" >Upload</IonButton>
    
          </form>
    
        </IonContent>
        </IonPage>
        );
    
    
      }
    
    
    export default withRouter(JobInfo);
    
  • 共有1个答案

    何乐
    2023-03-14

    您忘记在输入元素中使用ref。使用promise。所有这些都是为了约束所有的promise。

    因此,您的问题可以通过以下方式解决:

    const { useState, useRef } = React;
    
    function Uploader() {
       const file = useRef({});
       
       function readContent(file) {
          return new Promise((accept, reject) => {
             const reader = new FileReader();
             reader.readAsDataURL(file);
             reader.onload = () => accept({
                name: file.name,
                type: file.type,
                content: reader.result
             });
             reader.onerror = () => reject();
          });
       }
      
       function upload(file) { // fake upload
       
          return new Promise(accept => {
             setTimeout(() => accept(file), 1000);
          });
       }
       
       function onSubmit(event) {
          event.preventDefault();
          
          const filesAsArray = [...file.current.files];
          const fileInfo = Promise.all(filesAsArray.map(readContent))
              .then(files => Promise.all(files.map(upload)))
              .then(console.log);
          
          return false;
       }
       
       return (
         <div>
           <form onSubmit={onSubmit}>
             <input ref={file} type="file" multiple={true} />
             <input type="submit" value="Upload" />
           </form>
         </div>
       );
    }
    
    ReactDOM.render(<Uploader />, document.getElementById("root"));
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    
    <div id="root"></div>
     类似资料:
    • 在angular中,如果文本是在两个单独的组件中,是否可以将它们环绕在图像周围?还是图像和文本必须存在于同一个组件中?

    • 我正在尝试将一组照片上载到服务器,但请求失败。文件数组到达时总是显示为空。 req.body按预期显示数组。 图像通过Dropzone组件添加。(我尝试将其切换为标准输入,但它们似乎都以相同的方式传递文件) 图像被应用到FormData,名称图像文件在通过设置了多部分/表单数据标题的Axios POST请求发送之前被追加。 一旦传递到服务器,只有req.body似乎包含任何数据,req.files

    • 浏览图像 可从已登录至频道的网页接收数据,并播放图像。 使用操作接口 播放幻灯片秀

    • 浏览图像 选择相片时,会显示以下的图标。 摄影机 连接PSP™专用摄影机(选购品)后,可拍摄静止图像或影像。 Memory Stick™ 可浏览保存于Memory Stick™的图像。 主机内存 可浏览保存于主机内存的图像。   相机图像 可浏览支持Memory Stick™之数码(数字)相机所拍摄的图像。 (文件夹) 仅于存在使用计算机新建之文件夹时显示。 (图像档案) 可浏览保存于Memory

    • 我在一个目录中有猫的图片。我想手动对这些图像应用数据增强。 我的目录是< code >下载/图像/猫/。< br >此目录包含带有两种标签/名称的图像: ,,... ,,... 指定两种类型的猫图像。 那么如何仅从 python 中的目录中遍历标签为 1 的图像呢?

    • 我正在使用Retrofit将图像上传到我的服务器。在这里,我需要为一个键上传多个图像。我已经尝试过Postman Web客户端,它运行良好。这是一个截图。 以下是请求的键值对。 SurveyImage:[file1, file2, file3]; 属性图像:文件 DRA:jsonbody 我试图用Retrofit做同样的事情。但图像未上传到服务器。这是我的代码。 WebServicesAPI.ja