网站内容管理系统上传图片( 从零实现一款图片/文件上传组件以及扩展出更强大的上传方案)

优采云 发布时间: 2021-11-01 18:16

  网站内容管理系统上传图片(

从零实现一款图片/文件上传组件以及扩展出更强大的上传方案)

  

  前言

  图片/文件上传组是企业项目开发中必不可少的环节之一,但是所有的用户模块都会有图片/文件上传的需求,也是很多第三方组件库(ant desigin, element ui) 一. 接下来笔者将带大家从头实现一个图片/文件上传组件,扩展一个更强大的上传组件。

  你会收获文字

  作为前端工程师,解决项目问题是我们的基本职责之一。我们可以利用所获得的知识来解决项目开发中的问题和需求。这也是我们职业生涯的第一个阶段,即————适应期。想要继续晋升,就需要不断的提升和掌握各种技能,这样才能在以后遇到问题的时候用最好的方案高效的解决问题,也就是第二阶段——发展期。

  为了更快地进入发展期,我们需要不断提升自身技术的深度和广度。我们可以纵向考虑问题的性质,横向提出问题的多个解决方案,最后选择一个最优解来实现。要做到这一点,我们需要深入思考,检讨问题。接下来,笔者将介绍几种常用的图片上传方案,以扩大大家的广度。

  1. 常用图片上传方案

  从web1.0时*敏*感*词*始,最常用的上传方案就是表单形式。我们只需要在表单中写入各种输入(输入元素),并定义上传服务器地址(动作)。是的,格式类似于以下内容:

                        

  当XHR技术不流行时,我们大多选择上述方案。唯一的缺点是提交后页面会刷新。用户体验不好,可能会造成部分数据丢失,但还是有一个解决方案,就是form+iframe技术。

  1.1个表单+iframe计划

  form+iframe方案的基本思路是我们的提交动作是在父页面触发的,但是form表单指向iframe,可以实现部分刷新。现在一些场景仍然使用这种解决方案。具体原则如下:

  

  以上两种方案都可以实现传统表单提交下的部分刷新功能,但是方案一需要单独维护iframe表单,所以我一般使用方案二,兼容性可以达到IE9(虽然目前兼容IE浏览器) )不大,但还是要懂)

  1.2 ajax + formData 解决方案

  XHR流行之后,我们可以很方便的使用ajax来实现异步请求。对于文件上传,我们也可以更灵活地使用ajax和formData来实现,逐步摆脱对原生表单的依赖。

  我们先来看一个简单的使用formData上传文件的例子:

  let formData = new FormData();  // HTML 文件类型input,由用户选择 formData.append("userfile", fileInputElement.files[0]);  let request = new XMLHttpRequest(); request.open("POST", "http://http://io.nainor.com/h5/form"); request.send(formData); 

  上面仅仅5行代码就实现了通过formData将文件上传到服务器,是不是很简单?作者之前基于react/vue开发的文章,专门为程序员开发了一个朋友圈应用。本课程结束后,有兴趣者可自行研究学习。

  实现多文件上传也很简单。这里我们以axios为例,具体实现如下:

  const formData = new FormData() for(let i=0; i {   const [fileList, setFileList] = useState([     {       uid: '-1',       name: 'image.png',       status: 'done',       url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',     },   ]);    const onChange = ({ fileList: newFileList }) => {     setFileList(newFileList);   };    const onPreview = async file => {     let src = file.url;     if (!src) {       src = await new Promise(resolve => {         const reader = new FileReader();         reader.readAsDataURL(file.originFileObj);         reader.onload = () => resolve(reader.result);       });     }     const image = new Image();     image.src = src;     const imgWindow = window.open(src);     imgWindow.document.write(image.outerHTML);   };    return (                     {fileList.length  {   const fileList = [     {       uid: uuid(8, 16),       name: 'h5-dooring图片库',       status: 'done',       url: this.state.curSelectedImg,     },   ];   this.props.onChange && this.props.onChange(fileList);   this.setState({ fileList, wallModalVisible: false }); }; 

  这里使用的是antd的form组件的受控方式。

  4. 图片上传组件扩展

  上述方案对于基本的使用场景完全够用,但是如果是内容网站或者可视化构建平台,由于我们的配置随时可能分发到公网,这就涉及到内容安全问题,如果用户一旦配置了违法的图片信息,就有可能牵连到平台提供,所以我们也需要提供完善的审核机制。但是单纯依靠人工审核的效率比较低,所以这个时候就需要寻找机器自动化的审核方案。比如阿里云和腾讯云提供图像识别等服务,我们可以将这些服务集成到我们的组件中,从而实现真正的业务自主,从而更安全地进行企业运营和发展。

  另一个需求是用户对上传的图片有编辑需求。我们也可以提供图片的在线编辑功能,类似下面的解决方案:

  

  我们可以让用户自己设计图片,加水印等等,这样更有意思吗?

  5. 总结

  以上教程作者已经集成到H5-Dooring中。对于一些比较复杂的交互功能,也可以通过合理的设计来实现。你可以自己探索和学习。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线