HTML 表单输入类型文件预选值 javascript
HTML form input type file preselect value with javascript
这是一个自我回答的问题,旨在为所有找到 this 但仍然没有答案(我找不到)的人提供答案。预选文件 是可能的(至少对于图像)。这可能不太实用,但有可能。
解决方案如下:(适用于 Firefox 82.0.3 和最新 Chrome [11-2020])
HTML:
<input id="my-input" type="file">
JavaScript:
const input = document.getElementById("my-input"); // your input element type="file"
const url = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Test.svg/620px-Test.svg.png"
// a url with a resource
const dt = new DataTransfer(); // create virtual DataTransfer object
const request = new XMLHttpRequest(); // create the HTTP request
request.open("GET", url, true);
request.responseType = "arraybuffer";
// with images this works. For other types you'll find an answer yourself eventually :)
const fileType = (url.substr(url.lastIndexOf(".") + 1));
const mimeType = ("image/" + fileType).replace("jpg", "jpeg"); // there is no MIME type image/jpg only image/jpeg
request.overrideMimeType(mimeType); // idk if this is necessary but it works
request.onload = function (e) {
const blob = new Blob([this.response], {type: mimeType}); // create Blob object from response
const file = new File([blob], "your filename") // create File object from Blob
dt.items.add(file); // add file to virtual DataTransfer
input.files = dt.files; // place input content with new content
}
request.send(); // execute request
const myImage = document.getElementById("my-selected-image");
const input = document.getElementById("my-input"); // your input element type="file"
const url = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Test.svg/620px-Test.svg.png" // a url with a resource
window.onload = function() { // on document load
const dt = new DataTransfer(); // create virtual DataTransfer object
const request = new XMLHttpRequest(); // create the HTTP request
request.open("GET", url, true);
request.responseType = "arraybuffer";
// with images this works. For other types you'll find an answer yourself eventually :)
const fileType = (url.substr(url.lastIndexOf(".") + 1));
const mimeType = ("image/" + fileType).replace("jpg", "jpeg"); // there is no MIME type image/jpg only image/jpeg
request.overrideMimeType(mimeType); // idk if this is necessary but it works
request.onload = function(e) {
const blob = new Blob([this.response], {
type: mimeType
}); // create Blob object from response
const file = new File([blob], "your filename." + fileType, {
type: mimeType
}) // create File object from Blob
dt.items.add(file); // add file to virtual DataTransfer
input.files = dt.files; // place input content with new content
input.dispatchEvent(new Event("change"));
}
request.send(); // execute request
}
// only if you want to display the file
input.addEventListener("change", function() {
const reader = new FileReader();
reader.onload = function(e) {
myImage.src = e.target.result;
myImage.removeAttribute("hidden");
};
reader.readAsDataURL(input.files[0]);
})
<input id="my-input" type="file">
<img src="" id="my-selected-image" hidden>
这是一个自我回答的问题,旨在为所有找到 this 但仍然没有答案(我找不到)的人提供答案。预选文件 是可能的(至少对于图像)。这可能不太实用,但有可能。
解决方案如下:(适用于 Firefox 82.0.3 和最新 Chrome [11-2020])
HTML:
<input id="my-input" type="file">
JavaScript:
const input = document.getElementById("my-input"); // your input element type="file"
const url = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Test.svg/620px-Test.svg.png"
// a url with a resource
const dt = new DataTransfer(); // create virtual DataTransfer object
const request = new XMLHttpRequest(); // create the HTTP request
request.open("GET", url, true);
request.responseType = "arraybuffer";
// with images this works. For other types you'll find an answer yourself eventually :)
const fileType = (url.substr(url.lastIndexOf(".") + 1));
const mimeType = ("image/" + fileType).replace("jpg", "jpeg"); // there is no MIME type image/jpg only image/jpeg
request.overrideMimeType(mimeType); // idk if this is necessary but it works
request.onload = function (e) {
const blob = new Blob([this.response], {type: mimeType}); // create Blob object from response
const file = new File([blob], "your filename") // create File object from Blob
dt.items.add(file); // add file to virtual DataTransfer
input.files = dt.files; // place input content with new content
}
request.send(); // execute request
const myImage = document.getElementById("my-selected-image");
const input = document.getElementById("my-input"); // your input element type="file"
const url = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Test.svg/620px-Test.svg.png" // a url with a resource
window.onload = function() { // on document load
const dt = new DataTransfer(); // create virtual DataTransfer object
const request = new XMLHttpRequest(); // create the HTTP request
request.open("GET", url, true);
request.responseType = "arraybuffer";
// with images this works. For other types you'll find an answer yourself eventually :)
const fileType = (url.substr(url.lastIndexOf(".") + 1));
const mimeType = ("image/" + fileType).replace("jpg", "jpeg"); // there is no MIME type image/jpg only image/jpeg
request.overrideMimeType(mimeType); // idk if this is necessary but it works
request.onload = function(e) {
const blob = new Blob([this.response], {
type: mimeType
}); // create Blob object from response
const file = new File([blob], "your filename." + fileType, {
type: mimeType
}) // create File object from Blob
dt.items.add(file); // add file to virtual DataTransfer
input.files = dt.files; // place input content with new content
input.dispatchEvent(new Event("change"));
}
request.send(); // execute request
}
// only if you want to display the file
input.addEventListener("change", function() {
const reader = new FileReader();
reader.onload = function(e) {
myImage.src = e.target.result;
myImage.removeAttribute("hidden");
};
reader.readAsDataURL(input.files[0]);
})
<input id="my-input" type="file">
<img src="" id="my-selected-image" hidden>