簡體   English   中英

將 URL 中的圖像加載到文件輸入字段中

[英]Load image from URL into file input field

是否可以使用 JavaScript 將圖像 URL 放入准備提交的<input type="file">中? 或者達到類似的效果? 實際上,我的圖片位於http://example.com/xxx/image.jpg ,我想將其“預加載”到使用注冊表中,這樣它就可以與表單一起提交,就好像它是從使用輸入字段的磁盤。

案例場景是從 API 獲得的用戶數據,我想用它來填充用戶注冊表單,其中一個字段是用戶的頭像,API 將其作為 URL 移交。

這不是關於如何使用輸入字段預覽從磁盤中選擇的圖像!

這不可能。 作為替代解決方案,您可以使用input[type="url"]然后在提交時創建要使用 JavaScript 上傳的文件:

async function getFileFromUrl(url, name, defaultType = 'image/png') {
  const response = await fetch(url)
  const data = await response.blob()
  return new File([data], name, {
    type: data.type || defaultType,
  })
}

或者不使用此 function,您可以將其轉換為 base64:

async function getBase64FromUrl(url) {
  let reader = new FileReader();
  const response = await fetch(url)
  const data = await response.blob()

    return await new Promise((resolve, reject) => {
    reader.onload = () => resolve(reader.result);
    reader.onerror = reject;
    reader.readAsDataURL(data);
  })
}

並上傳 base64 字符串。

使用 FileReader API 的示例。 這將加載在圖像 html 對象中的文件對象中加載的圖像。

<!DOCTYPE html>

<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>

        <div>
            <input id="btnFile" type="file" accept="image/*" />
        </div>

        <div>
            <img id="img" style="max-width: 100px" />
        </div>


        <script>



            var btnFile = document.getElementById("btnFile");

            //Register event on file selected or changed.
            addEvents(btnFile, "change", function (event) {
                if (event.target.files.length !== 0) {
                    var file = event.target.files[0];
                    //Check if the file is IMAGE.
                    if (file.type.match("image.*")) {

                        var fl = new FileReader();

                        //Add event to read the content file.
                        addEvents(fl, "load", function (evt) {
                            //alert(evt.target.result);
                            try {


                                //CONVERT ARRAY BUFFER TO BASE64 STRING.
                                var dataURL = evt.target.result;

                                document.getElementById("img").src = dataURL;


                            } catch (e) {
                                alert(e);
                            }

                        });

                        //Read the file as arraybuffer.

                        fl.readAsDataURL(file);

                    } else {

                        alert("Please select a IMAGE FILE");
                    }
                }

            });

            function addEvents(obj, evtName, func) {
                if (obj.addEventListener !== undefined && obj.addEventListener !== null) {
                    obj.addEventListener(evtName, func, false);
                } else if (obj.attachEvent !== undefined && obj.attachEvent !== null) {
                    obj.attachEvent(evtName, func);
                } else {
                    if (this.getAttribute("on" + evtName) !== undefined) {
                        obj["on" + evtName] = func;
                    } else {
                        obj[evtName] = func;
                    }
                }

            }

            function removeEvents(obj, evtName, func) {
                if (obj.removeEventListener !== undefined && obj.removeEventListener !== null) {
                    obj.removeEventListener(evtName, func, false);
                } else if (obj.detachEvent !== undefined && obj.detachEvent !== null) {
                    obj.detachEvent(evtName, func);
                } else {
                    if (this.getAttribute("on" + evtName) !== undefined) {
                        obj["on" + evtName] = null;
                    } else {
                        obj[evtName] = null;
                    }
                }

            }

        </script>
    </body>
</html>

出於安全原因,輸入 type="file" 的值以編程方式是只讀的,所以不,這是不可能的。

參考鏈接: https : //www.w3schools.com/jsref/prop_fileupload_value.asp

正如 Jahl 所說,出於安全原因不能這樣做,但作為替代方案,您可以有一個隱藏的輸入值並填充它。 顯示圖像並可以選擇提交不同的圖像——如果沒有提交其他圖像,則默認使用加載的頭像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM