
go wails开发 前端获取本地文件夹中文件
作者: boyyang
分类: 后端开发
发布: 2024-04-30 06:19:26
更新: 2025-03-31 05:59:57
浏览: 683
如果项目中的静态资源是存储到线上服务器中,按照正常的前后端分离的开发方式就行了,但是我的应用没有使用到任何线上资源,数据存储到本地sqllite中,图片资源存储到沙盒中的指定文件夹中。
可以将沙盒中的指定文件夹搭建成静态资源文件服务器,但是得解决上架权限等相关问题。将文件夹作为文件服务器(该方法本地使用是没有任何问题的,前端通过ip+端口+文件名称能正常访问到文件)代码如下:
package app
import (
"context"
"fmt"
"gorm.io/gorm"
"log"
"wallpaperCollector/utils"
)
// App struct
type App struct {
ctx context.Context
mux *http.ServeMux // 定义文件服务
}
func NewApp() *App {
return &App{}
}
func (a *App) Startup(ctx context.Context) {
a.ctx = ctx
//初始化文件服务
a.mux = http.NewServeMux()
path := utils.AppDir() // 文件夹路径
a.mux.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir(path))))
if err := http.ListenAndServe(":3008", a.mux); err != nil {
log.Fatal(err)
}
}
打开浏览器访问localhost:3008
,也能够访问到文件。正常情况下可以直接这样使用,但是如果上架到苹果应用商店,可能会出现审核不通过的问题,由于你开启了本地服务,所以必须开启以下服务权限:
<key>com.apple.security.network.server</key>
<true/>
开启了该权限后,审核会检查你是否使用了该权限,如何审核人员没有在项目中找到你使用了该权限的功能,那么上架将会被驳回,被驳回后你得解释你使用了该权限,在什么地方使用了该权限,有些时候可能会通过,但是每次都得解释,有时又会被驳回。每次都这样就非常麻烦所以后来我找到了wails官方提供的方案完美解决了该问题。
wails官方解决方案 :如果你想为你的前端动态加载或生成资产,你可以使用 AssetsHandler 选项 来实现。 AssetsHandler 是一个通用的 http.Handler,对于资产服务器上的任何非 GET 请求以及由于找不到文件而无法从捆绑资产提供服务的 GET 请求,都会调用它。
package main
import (
"embed"
"fmt"
"github.com/wailsapp/wails/v2"
"github.com/wailsapp/wails/v2/pkg/options"
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
"net/http"
"os"
"strings"
"wallpaperCollector/backend/app"
)
//go:embed all:frontend/dist
var assets embed.FS
type FileLoader struct {
http.Handler
}
func NewFileLoader() *FileLoader {
return &FileLoader{}
}
func (h *FileLoader) ServeHTTP(res http.ResponseWriter, req *http.Request) {
requestedFilename := strings.TrimPrefix(req.URL.Path, "/")
fileData, err := os.ReadFile(requestedFilename)
if err != nil {
res.WriteHeader(http.StatusBadRequest)
_, err := res.Write([]byte(fmt.Sprintf("Could not load file %s", requestedFilename)))
if err != nil {
return
}
}
_, err = res.Write(fileData)
if err != nil {
return
}
}
func main() {
// Create an instance of the app structure
ap := app.NewApp()
// Create application with options
err := wails.Run(&options.App{
Title: "",
Width: 800,
Height: 550,
MinWidth: 600,
MinHeight: 550,
AssetServer: &assetserver.Options{
Assets: assets,
Handler: NewFileLoader(),
},
BackgroundColour: &options.RGBA{R: 0, G: 0, B: 0, A: 0},
OnStartup: ap.Startup,
Bind: []interface{}{
ap,
},
})
if err != nil {
println("Error:", err.Error())
}
}
这样前端直接访问文件名称,便能获取到文件了
wallpaperCollector Mac端个人壁纸管理软件