零成本!无需服务器,搭建你的图床!

先给大家看看成品:
image.png

访问地址:http://cp64mba5g6h48vl4is50.app.memfiredb.cn/

这是我花十分钟做出来的零成本,不需要服务器的图床,不需要登录,任何人都可以在上面上传图片和拿到图片链接去使用,当然这只是一个简单的图床功能,后续我会慢慢优化更强大。接下来我将教大家如何做一个零成本,无需服务器的免费图床。

1.创建免费应用

先去前往MemFire Cloud登录后,在首页创建一个免费的应用

image.png

这个应用创建完成后,你将拥有

  • 免费云数据库
  • 自动生成api
  • 对象存储
  • 二十几种第三方认证服务
  • 实时数据库
  • 静态托管

然后我们这个图床主要用到的是自动生成api和对象存储

2.创建存储桶

应用创建完成后,我们先去存储的界面创建一个存储桶用来存放图片

image.png

image.png

3.初始化vue项目

大家可以用npx或者vue创建都可以,我是用vue创建的

vue create vue-tuchuang

创建完成后,在根目录下创建一个.env.local,来存放环境变量

4.安装依赖包

安装用于访问应用资源的依赖包

npm i @supabase/supabase-js

5.配置环境变量

在MemFire Cloud应用控制台的“应用设置”->“API”找到应用的URL和anon 公钥,分别填到.env.local里面

image.png

VITE_SUPABASE_URL=
VITE_SUPABASE_ANON_KEY=

6.初始化客户端

在src下面创建一个supabase.js,将下面的代码填入

import { createClient } from '@supabase/supabase-js'const supabaseUrl = import.meta.env.VITE_SUPABASE_URL
const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEYexport const supabase = createClient(supabaseUrl, supabaseAnonKey)

7.编写页面

src\App.vue

<template><div id="app"><header><h1>图床</h1><input type="file" @change="handleFileUpload" accept="image/*" /></header><main><section v-if="fileList.length > 0"><h2>已上传的图片</h2><ul class="image-list"><li v-for="(image, index) in fileList" :key="index" class="image-item"><img :src="image.publicUrl" alt="uploaded image" @click="showImage(index)" /><div class="image-overlay"><span class="image-name">{{ truncateFileName(image.name) }}</span><button @click="copyImageUrl(index)">复制URL</button></div></li></ul></section><section v-else><p style="color: black;">暂无上传的图片</p></section></main><!-- 放大查看图片的弹窗 --><div v-if="showModal" class="modal" @click="closeModal"><div class="modal-content"><img :src="selectedImageUrl" alt="enlarged image" /></div></div></div>
</template><script>
import { ref, onMounted } from 'vue';
import { supabase } from './supabase';export default {setup() {const fileList = ref([]);const files = ref();const showModal = ref(false);const selectedImageUrl = ref('');onMounted(() => {getImageUrl();});const handleFileUpload = async (evt) => {files.value = evt.target.files;try {if (!files.value || files.value.length === 0) {throw new Error('请选择要上传的图片.');}const file = files.value[0];const fileExt = file.name.split('.').pop();const filePath = `${Math.random()}.${fileExt}`;let { error: uploadError } = await supabase.storage.from('drawingBoard').upload(filePath, file);if (uploadError) throw uploadError;getImageUrl();} catch (error) {alert(error.message);}};const copyImageUrl = (index) => {const publicUrl = fileList.value[index].publicUrl;navigator.clipboard.writeText(publicUrl).then(() => {alert(`已复制图片URL:${publicUrl}`);}).catch((err) => {console.error('复制失败:', err);});};const getImageUrl = async () => {const { data, error } = await supabase.storage.from('drawingBoard').list()const filteredData = data.filter(item => item.name !== ".emptyFolderPlaceholder");filteredData.forEach((item) => {const { data } = supabase.storage.from('drawingBoard').getPublicUrl(item.name)if (data) {item.publicUrl = data.publicUrl}})if(filteredData.length >0){fileList.value = filteredData}}const showImage = (index) => {selectedImageUrl.value = fileList.value[index].publicUrl;showModal.value = true;};const closeModal = () => {showModal.value = false;};const truncateFileName = (fileName) => {const maxLength = 20; // 设置名称最大长度if (fileName.length > maxLength) {return fileName.substring(0, maxLength - 3) + '...'; // 超过长度则省略}return fileName;};return {fileList,handleFileUpload,copyImageUrl,showImage,showModal,selectedImageUrl,closeModal,truncateFileName};},
};
</script><style>
#app {font-family: Arial, sans-serif;margin: 0 auto;max-width: 800px;padding: 20px;
}header {display: flex;align-items: center;justify-content: space-between;margin-bottom: 20px;
}
h2{color: #000;
}
header h1{font-size: 24px;margin: 0;
}input[type='file'] {display: inline-block;padding: 10px;
}main {background-color: #f5f5f5;padding: 20px;
}
ul.image-list li img:hover {transform: scale(1.1); /* Enlarge on hover */
}
ul.image-list {list-style: none;padding: 0;display: flex;flex-wrap: wrap;gap: 20px;
}.image-item {width: calc(33.33% - 20px);text-align: center;margin-bottom: 20px;position: relative;
}.image-item img {/* max-width: 100%;border-radius: 5px;box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);cursor: pointer; */max-width: 100%;height: auto; /* Maintain aspect ratio */border-radius: 5px;box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);cursor: pointer; /* Show pointer on hover for clicking */transition: transform 0.2s ease; /* Add smooth transition for scaling */
}.image-overlay {position: absolute;bottom: 10px;left: 0;right: 0;background-color: rgba(0, 0, 0, 0.5);padding: 5px;border-radius: 5px;
}.image-overlay .image-name {display: block;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;color: #000; /* 设置名称颜色为黑色 */
}button {padding: 5px 10px;margin-left: 10px;background-color: #007bff;color: white;border: none;border-radius: 3px;cursor: pointer;
}/* 弹窗样式 */
.modal {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.7);display: flex;justify-content: center;align-items: center;z-index: 999;
}.modal-content {max-width: 80%;max-height: 80%;overflow: auto;
}.modal-content img {max-width: 100%;max-height: 100%;border-radius: 5px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
}
</style>

8.运行程序

npm run dev

效果:

image.png

9.静态托管

项目开发完了,大家肯定想把这个作品展示给自己朋友或者网友使用,刚好我们使用MemFire Cloud的静态托管来托管我们的项目,就相当于部署我们的项目,我们不需要在服务器上部署。
在根目录下执行命令

npm run build

打包完成后,我们进入文件资源管理器,将里面的所有文件选中打成一个zip压缩包

image.png

image.png

我们再次打开MemFire Cloud应用的控制台,我们来到静态托管的选项下,然后将我们刚刚打包好的压缩包上传到这里,上传完成后会发现上面出现一个访问地址,这个地址就可以给大家安全的访问啦,如果你觉得这个地址有点丑,你还可以去配置域名,前提是你已经有了一个域名并且已经备案了。

image.png

好啦,咱们这个简单的图床就做好了,全程没有需要服务器,零成本完成的!后续我会慢慢优化这个图床!大家也可以试试用MemFire Cloud来做一些应用。

具体的大家可以参考或者阅读一下文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/30144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java面试】二十一、JVM篇(中):垃圾回收相关

文章目录 1、类加载器1.1 什么是类加载器1.2 什么是双亲委派机制 2、类装载的执行过程&#xff08;类的生命周期&#xff09;3、对象什么时候可以被垃圾回收器处理4、JVM垃圾回收算法4.1 标记清除算法4.2 标记整理算法4.3 复制算法 5、分代收集算法5.1 MinorGC、Mixed GC、Full…

大数据的发展,带动电子商务产业链,促进了社会的进步【电商数据采集API接口推动电商项目的源动力】

最近几年计算机技术在诸多领域得到了有效的应用&#xff0c;同时在多方面深刻影响着我国经济水平的发展。除此之外&#xff0c;人民群众的日常生活水平也受大数据技术的影响。 在这其中电子商务领域也在大数据技术的支持下&#xff0c;得到了明显的进步。虽然电子商务领域的发…

网页钓鱼-克隆修改--劫持口令下载后门

免责声明:本文仅做技术交流与学习... 目录 1-右键另存为 2-goblin项目(不推荐) 修改goblin.yaml文件 运行exe ​编辑 3-Setoolkit (kali自带) 网页克隆---> 1-右键另存为 --不行就再定位元素进行修改. 2-goblin项目(不推荐) GitHub - xiecat/goblin: 一款适用于红蓝…

云原生安全联防联抗策略玩转微隔离

前言 随着信息技术的发展、互联网的快速普及&#xff0c;越来越多的信息被存储在云端&#xff0c;企业面临的安全问题也日益突出。在《网络安全法》、《数据安全法》等多部法律法规要求下&#xff0c;各行业用户纷纷设立安全部门。不管安全部门里是“一人当关”还是“三三两两…

PCB AVI品质报告采集工具

AVI设备,品质报告. 可以通过: 过滤文件名指定文件名 排除多余的日志;运行日志为增量日志,可采用增量模式;品质报告可设置采集后删除; 下载: Gitee下载 最新版本 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自…

lammps聚合物建模组合技巧

大家好,我是小马老师。 本文介绍聚合物结构的组合问题。 在lammps模拟中,聚合物模拟应该算是比较复杂的一种模拟,不仅建模复杂、势参数较多,而且在模拟过程中也会经常出现各种意想不到的错误。 本文主要解决聚合物建模过程中常遇到的一个问题:多成分的组合。 比如下面的结…

【仿真建模-anylogic】Port原理解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-14 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 类图 2. 原理解析 2.1 核心函数&#xff1a; Port作为各类型端口的基类&#xff0c;其核心方法如下 &#xff1a; 函数功能Port(A…

Linux磁盘格式化与重新分区

1.df -BG查看磁盘挂载情况 2.fdisk -l查看磁盘详细信息 3.sudo mkfs.ext4 /path 格式化磁盘 4.挂载格式化后磁盘 挂载成功

初见DP

线性DP 例题1 1143. 最长公共子序列 &#xff08;LCS&#xff09; 子序列不连续 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#x…

opencv 视频处理

概述 OpenCV 的视频模块是其核心组成部分之一&#xff0c;主要负责视频文件的读取、处理、分析以及视频流的捕获和输出。这一模块使得开发者能够轻松地处理来自摄像头、文件或其他视频源的视频数据&#xff0c;进行实时或离线的图像处理和计算机视觉任务。以下是 OpenCV 视频模…

Pentest Muse:一款专为网络安全人员设计的AI助手

关于Pentest Muse Pentest Muse是一款专为网络安全研究人员和渗透测试人员设计和开发的人工智能AI助手&#xff0c;该工具可以帮助渗透测试人员进行头脑风暴、编写Payload、分析代码或执行网络侦查任务。除此之外&#xff0c;Pentest Muse甚至还能够执行命令行代码并以迭代方式…

Excel 找出最大值及其相邻的 N 个成员

某列都是数值&#xff1a; A1132213464215496973482396101113712491342144015151631171718114719182030212222423252419251326272738283029163012312332333233419351436463723383739384028 请找出最大值及其相邻的 10 个成员&#xff0c;注意越界检查&#xff0c;实际符合条件…

JAVA云HIS医院管理系统源码:可医保对接的云HIS运维平台源码 SaaS模式

JAVA云HIS医院管理系统源码&#xff1a;可医保对接的云HIS运维平台源码 SaaS模式 云HIS系统运用云计算、大数据、物联网等新兴信息技术&#xff0c;为医疗机构提供全面的医疗信息管理服务。该系统支持医保功能&#xff0c;通过与医保系统的对接&#xff0c;实现了医疗费用的自…

Boost 网络库

asio 网络编程的基本流程创建 socket绑定acceptor连接指定的端点服务器接受连接 网络编程的基本流程 服务端 1&#xff09;socket----创建socket对象。 2&#xff09;bind----绑定本机ipport。 3&#xff09;listen----监听来电&#xff0c;若在监听到来电&#xff0c;则建…

Vue 3的组合式API:你真的需要它吗?

Vue 3的组合式API&#xff1a;你真的需要它吗&#xff1f; 随着Vue 3的发布&#xff0c;我们迎来了一个新的API——组合式API&#xff08;Composition API&#xff09;。这个API为开发者提供了更灵活、更可复用的代码编写方式。然而&#xff0c;传统的选项式API&#xff08;Opt…

分布式操作系统入门:可的哥(Codigger)引领新潮流

早期&#xff0c;大型机系统盛行&#xff0c;随后个人计算机如Windows、Mac OS等操作系统普及。随着技术发展和计算需求增长&#xff0c;单机系统的局限显现&#xff0c;推动了分布式操作系统的崛起。操作系统演进显露出从单机到多机、从集中到分散的趋势。传统单机系统在处理大…

OPenCV实现把人形轮廓画在实时视频画面中

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 1.功能描述 当你从摄像头读取实时视频时&#xff0c;如果想在视频的画面中画一个方框&#xff0c;或者是画一个圆&#xff0c;是很简单的事情&#xff0c;可是…

Python爬虫技术:动态JavaScript加载音频的解析

在当今的互联网世界中&#xff0c;JavaScript已成为构建丰富交互体验不可或缺的技术。然而&#xff0c;对于网络爬虫开发者来说&#xff0c;JavaScript动态生成的内容却带来了不小的挑战。音频内容的动态加载尤其如此&#xff0c;因为它们往往涉及到复杂的用户交互和异步数据加…

【python】Sklearn—Cluster

参考学习来自 10种聚类算法的完整python操作示例 文章目录 聚类数据集亲和力传播——AffinityPropagation聚合聚类——AgglomerationClusteringBIRCH——Birch&#xff08;✔&#xff09;DBSCAN——DBSCANK均值——KMeansMini-Batch K-均值——MiniBatchKMeans均值漂移聚类——…

【C#】字符串处理器

实现&#xff1a; 统计字符串中单词的数量。查找字符串中最长的单词&#xff0c;并显示其长度。将字符串中的所有单词首字母大写。将字符串中的所有单词反转。 要求&#xff1a; 使用面向对象的方式实现&#xff0c;包括至少一个类&#xff08;例如 StringProcessor&#xf…