BOYYANG/1/blog/完美世界 清漪 同人美女高清4K壁纸3840x2400_彼岸图网

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端个人壁纸管理软件

#go
#后端
#wails