无法为生产环境创建文件

时间:2020-01-21 10:32:49

标签: go google-cloud-platform

我使用Google Cloud Platform(GCP)和Golang。

我的本​​地环境可以运行代码,但是生产环境(GCP)无法运行。

我看到了日志。 =>

open stylesheet/qrcode.png: no such file or directory 
read-only file system

所以我尝试使用chmod。例如chmod 644或777 qrcode.png

我正在尝试创建图像:qrcode.png <=它是虚拟文件。 但是代码无法运行。

还有其他方法吗?

package main

import (
    "fmt"
    "image/png"
    "log" ............

    "github.com/boombuler/barcode"
    "github.com/boombuler/barcode/qr"
)


func createQr() {
    rand.Seed(time.Now().UnixNano())
    result = ""
    for i := 0; i < 4; i++ {
        s := strconv.Itoa(rand.Intn(10))
        result = result + s
    }
    qrCode, _ := qr.Encode(result, qr.M, qr.Auto) //info
    qrCode, _ = barcode.Scale(qrCode, 200, 200)   //size

    PIN, _ = strconv.Atoi(result)
    file, _ := os.Create("stylesheet/qrcode.png")
    defer file.Close()

    // encode the barcode as png
    png.Encode(file, qrCode)
    fmt.Println(file)

    starttime = time.Now()
}

file, _ := os.Create("stylesheet/qrcode.png")

此代码无效。

2 个答案:

答案 0 :(得分:2)

如果您要部署到App Engine标准版,则只能写入/tmp folder in the filesystem

尽管要谨慎处理生成的文件。在一个实例的文件系统中生成该文件后,该文件就无法像应用程序的CSS和JS文件一样提供服务。另外,实例是无状态的,您的下一个请求可能会碰到任何其他实例,并且任何实例通常都会被自动缩放器关闭。

我的建议是:

  • 如果您只想立即提供一次,则请您的处理程序仅执行一次,然后将QR码PNG字节流传输到ResponseWriter(实现io.Writer)并设置适当的响应标头content-type。无需使用文件。
  • 如果您需要持久生成的映像文件,则将其存储在Cloud Storage或Firestore中。然后,您将需要一种策略,以通过https(Cloud Storage中的对象访问权限,Firestore的App Engine处理程序)正确地提供服务。

此外,请务必检查并处理错误,切勿用_吞下它们!

答案 1 :(得分:0)

您的生产环境是否具有要导入的github的网络路径。查看您的日志文件,您可能会发现它找不到github。大多数生产环境都没有通往Internet的网络路径。

您必须下载这些外部软件包并将其作为代码库的一部分寄出。