英文:
How do I detect file type of input that's piped into a Go program that expects either images or gifs?
问题
我有一个命令行工具,可以接受文件路径或URL(可以是GIF或图像)作为输入。目前,我通过它们的扩展名(路径末尾的.gif
、.jpg
等)来区分这两者,但是如果输入是从命令行中的其他进程中传输的,我不知道该如何区分。
例如,在下面的示例中,myGoProgram
如何知道管道输入是 .png
还是 .gif
?
cat image.png | ./myGoProgram -
这是我目前如何使用 image
Go 模块解码管道输入的图像:
decodedImg, _, err := image.Decode(os.Stdin)
...同样,使用 image/gif
Go 模块解码 GIF 的方式如下:
decodedGif, err = gif.DecodeAll(os.Stdin)
但是我不明白如何从 os.Stdin
中知道它是 GIF 还是图像。
英文:
I have a cli tool that accepts input in the form of file paths or urls (which can be gifs or images). Currently, I'm differentiating btw the two by their extensions (.gif
, .jpg
etc at the end of the paths), but I'm stumped on how to do that if the input is piped from a different process in the command line.
For instance, how will myGoProgram
know the piped input is a .png
or a .gif
in the example below?
cat image.png | ./myGoProgram -
Here's how I'm decoding piped stdin for an image using the image
go module right now:
decodedImg, _, err := image.Decode(os.Stdin)
...And the same with a decoding a gif through the image/gif
go module:
decodedGif, err = gif.DecodeAll(os.Stdin)
But I don't understand how I'm supposed to know if it's a gif or an image from os.Stdin
答案1
得分: 3
通过@mkopriva提供的问题,我能够找到一个解决方案。
我区分图像、gif和无效输入的整体逻辑如下:
// 导入:
import (
"io/ioutil"
"log"
"net/http"
"os"
)
// -----
// 逻辑:
var pipedInputTypes = []string{
"image/png",
"image/jpeg",
}
var inputIsGif bool
pipedInputBytes, err := ioutil.ReadAll(os.Stdin)
if err != nil {
log.Fatalf("无法读取管道输入:%v", err)
}
fileType := http.DetectContentType(pipedInputBytes)
invalidInput := true
if fileType == "image/gif" {
inputIsGif = true
invalidInput = false
} else {
for _, inputType := range pipedInputTypes {
if fileType == inputType {
invalidInput = false
break
}
}
}
if invalidInput {
log.Fatalf("无法读取类型为\"%v\"的管道输入", fileType)
}
if inputIsGif {
// 使用pipedInputBytes的Gif程序逻辑
} else {
// 使用pipedInputBytes的图像程序逻辑
}
英文:
Was able to work out a solution with the help of the question referred by @mkopriva
Overall logic for how I differentiated btw images, gifs and invalid inputs:
// imports:
import (
"io/ioutil"
"log"
"net/http"
"os"
)
// -----
// logic:
var pipedInputTypes = []string{
"image/png",
"image/jpeg",
}
var inputIsGif bool
pipedInputBytes, err := ioutil.ReadAll(os.Stdin)
if err != nil {
log.Fatalf("Unable to read piped input: %v", err)
}
fileType := http.DetectContentType(pipedInputBytes)
invalidInput := true
if fileType == "image/gif" {
inputIsGif = true
invalidInput = false
} else {
for _, inputType := range pipedInputTypes {
if fileType == inputType {
invalidInput = false
break
}
}
}
if invalidInput {
log.Fatalf("Cannot read piped input of type \"%v\"", fileType)
}
if inputIsGif {
// Gif program logic with pipedInputBytes
} else {
// Image program logic with pipedInputBytes
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论