芝麻麻 發表於 2023-6-7 10:12:00

JavaScript上传文件

<h3 id="效果">效果</h3>
<p><img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1f1dbd5f720f4881aaaa337427e05f57~tplv-k3u1fbpfcp-watermark.image?" alt="screenshots.gif" loading="lazy"></p>
<h3 id="实现">实现</h3>
<ul>
<li>无论是上传文件还是上传图片,用的都是<code>input</code>标签的<code>type="file"</code>;</li>
<li><code>input</code>标签触发<code>onChange</code>事件时,会接受<code>input</code>元素本身作为参数,元素对象的<code>files</code>属性,值是<code>fileList</code>(即文件列表,列表中是一个个文件对象,文件对象包括文件的名称,大小等);</li>
<li>有了文件列表之后,需要创建一个<code>FileReader对象</code>,对象的<code>readerAsDataURL()</code>方法可以将上传的图片转为<code>base64</code>,然后存入到图片路径,这样就可以上传任意位置的路径;</li>
<li>图片的预览要注意文件的读取是异步的,所以要给<code>FileReader</code>对象一个读取完成的方法,使用<code>readAsDataURL</code>会返回一个<code>url</code>,这个值就保存在事件对象的<code>result</code>里,<code>img</code>通过加载这个地址,完成图片的加载;</li>
</ul>
<h3 id="代码">代码</h3>
<pre><code class="language-js">&lt;!DOCTYPE html&gt;

&lt;html lang="en"&gt;

&lt;head&gt;

&nbsp; &lt;meta charset="UTF-8"&gt;

&nbsp; &lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;

&nbsp; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;

&nbsp; &lt;title&gt;Document&lt;/title&gt;

&lt;/head&gt;

&lt;style&gt;

&nbsp; .container {

&nbsp; &nbsp; width: 500px;

&nbsp; &nbsp; height: 800px;

&nbsp; }

&nbsp; .img-container {

&nbsp; &nbsp; width: 300px;

&nbsp; &nbsp; height: 300px;

&nbsp; &nbsp; position: relative;

&nbsp; }

&nbsp; .file-container {

&nbsp; &nbsp; margin-top: 20px;

&nbsp; &nbsp; width: 300px;

&nbsp; &nbsp; height: 100px;

&nbsp; &nbsp; border: 1px solid #d88080;

&nbsp; }

&nbsp; .show {

&nbsp; &nbsp; width: 300px;

&nbsp; &nbsp; height: 300px;

&nbsp; &nbsp; border: 1px solid rgb(71, 219, 128);

&nbsp; }

&nbsp; .upload {

&nbsp; &nbsp; width: 300px;

&nbsp; &nbsp; height: 300px;

&nbsp; &nbsp; border: 1px solid rgb(216, 120, 120);

&nbsp; &nbsp; position: absolute;

&nbsp; &nbsp; top: 0;

&nbsp; &nbsp; left: 0;

&nbsp; }

&nbsp; .upload .icon {

&nbsp; &nbsp; font-size: 40px;

&nbsp; &nbsp; color: blue;

&nbsp; &nbsp; margin-top: 100px;

&nbsp; &nbsp; height: 50px;

&nbsp; &nbsp; cursor: pointer;

&nbsp; &nbsp; text-align: center;

&nbsp; }

&nbsp; .upload .text {

&nbsp; &nbsp; width: 300px;

&nbsp; &nbsp; height: 50px;

&nbsp; &nbsp; font-size: 16px;

&nbsp; &nbsp; text-align: center;

&nbsp; }

&nbsp; .upload .img-input {

&nbsp; &nbsp; width: 300px;

&nbsp; &nbsp; height: 300px;

&nbsp; &nbsp; position: absolute;

&nbsp; &nbsp; top: 0;

&nbsp; &nbsp; left: 0;

&nbsp; &nbsp; opacity: 0;

&nbsp; }

&lt;/style&gt;

&lt;body&gt;

&nbsp; &lt;div class="container"&gt;

&nbsp; &nbsp; &lt;div class="img-container"&gt;

&nbsp; &nbsp; &nbsp; &lt;div class="show"&gt;&lt;/div&gt;

&nbsp; &nbsp; &nbsp; &lt;div class="upload"&gt;

&nbsp; &nbsp; &nbsp; &nbsp; &lt;div class="icon"&gt;+&lt;/div&gt;

&nbsp; &nbsp; &nbsp; &nbsp; &lt;div class="text"&gt;请选择图片&lt;/div&gt;

&nbsp; &nbsp; &nbsp; &nbsp; &lt;input class="img-input" type="file" onchange="uploadImg(this)" /&gt;

&nbsp; &nbsp; &nbsp; &lt;/div&gt;

&nbsp; &nbsp; &lt;/div&gt;

&nbsp; &nbsp; &lt;div class="file-container"&gt;

&nbsp; &nbsp; &nbsp; &lt;p&gt;请上传文件&lt;/p&gt;

&nbsp; &nbsp; &nbsp; &lt;input class="file-input" type="file" onchange="uploadFile(this)" /&gt;

&nbsp; &nbsp; &lt;/div&gt;

&nbsp; &lt;/div&gt;

&lt;/body&gt;

&lt;script type="text/javascript"&gt;

&nbsp; uploadImg = function (file) {

&nbsp; &nbsp; console.log(file.files);

&nbsp; &nbsp; let reader = new FileReader()

&nbsp; &nbsp; reader.readAsDataURL(file.files)

&nbsp; &nbsp; reader.onloadend = function (e) {

&nbsp; &nbsp; &nbsp; console.log("e.target.result", e.target.result);

&nbsp; &nbsp; &nbsp; let base64 = e.target.result.split(',')

&nbsp; &nbsp; &nbsp; getBase64(base64)

&nbsp; &nbsp; &nbsp; console.log("base64", base64);
      //接下来是发送ajax请求,就不演示了,在上传成功(即请求结果成功)后,回显图片,调用createImg(res)函数,参数是res

&nbsp; &nbsp; }

&nbsp; }

&nbsp; function createImg(imgSrc) {

&nbsp; &nbsp; let imgEle = document.createElement('img')

&nbsp; &nbsp; imgEle.src = imgSrc

&nbsp; &nbsp; document.querySelector('.upload').appendChild(imgEle)

&nbsp; }

&nbsp; function getBase64(base64) {

&nbsp; &nbsp; let base64Res = 'data:image/jpg;base64,' + base64.replace(/[\r\n]/g)

&nbsp; &nbsp; console.log("base64Res ", base64Res); // === e.target.result

&nbsp; &nbsp; let imgEle = document.createElement('img')

&nbsp; &nbsp; imgEle.style.width = '300px'

&nbsp; &nbsp; imgEle.style.height = '300px'

&nbsp; &nbsp; imgEle.style.position = 'absolute'

&nbsp; &nbsp; imgEle.style.top = 0

&nbsp; &nbsp; imgEle.style.left = 0

&nbsp; &nbsp; imgEle.src = base64Res

&nbsp; &nbsp; document.querySelector('.upload').appendChild(imgEle)

&nbsp; }

&nbsp; uploadFile = function (file) {

&nbsp; &nbsp; let reader = new FileReader()

&nbsp; &nbsp; reader.readAsText(file.files)

&nbsp; &nbsp; console.log(reader);

&nbsp; &nbsp; reader.onload = () =&gt; {

&nbsp; &nbsp; &nbsp; let res = JSON.parse(decodeURIComponent(reader.result))

&nbsp; &nbsp; &nbsp; console.log(res); &nbsp;//不带""

&nbsp; &nbsp; &nbsp; console.log(reader.result); //带""

&nbsp; &nbsp; }

&nbsp; }

&lt;/script&gt;

&lt;/html&gt;
</code></pre><br><br>
来源:https://www.cnblogs.com/rain111/p/17462594.html
頁: [1]
查看完整版本: JavaScript上传文件