5 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
后端(在 Go 中實(shí)現(xiàn))將以 io 的形式接收文件。ReadCloser.有沒(méi)有辦法從io中提取它。ReadCloser?
不。
看看io的方法。ReadCloser 通過(guò)運(yùn)行提供,并注意沒(méi)有一個(gè)方法可以提供名稱。所以除非你什么都不知道,它是一個(gè)io。ReadCloser 你根本做不到。go doc io.ReadCloser

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
package main
import (
"errors"
"fmt"
"io"
"os"
)
func fatalln(err error) {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
// hasName interface is an interface that expects types
// that implements it to have "Name() string" method.
type hasName interface {
Name() string
}
func open(name string) (io.ReadCloser, error) {
f, err := os.Open(name)
if err != nil {
return nil, err
}
// f implements io.ReadCloser interface as *os.File
// has Read and Close methods.
return f, nil
}
func main() {
// rc is of the type io.ReadCloser
rc, err := open("example.txt")
if err != nil {
fatalln(err)
}
defer rc.Close()
// Type assetion to check rc's underlying type has
// a method "Name() string".
f, ok := rc.(hasName)
if !ok {
fatalln(errors.New("type assertion failed"))
}
// Yay, type assertion succeeded. Print the name!
fmt.Println("Name:", f.Name())
}

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
通過(guò)定義嵌入的接口,您可以預(yù)先需要一個(gè)方法:io.ReaderName()
package main
import (
"fmt"
"io"
"log"
"os"
)
type NamedReadCloser interface {
io.ReadCloser
Name() string
}
func doThings(f NamedReadCloser) error {
defer f.Close()
b, err := io.ReadAll(f)
if err != nil {
return err
}
fmt.Printf("Name: %s, Content: %s\n", f.Name(), b)
return nil
}
func main() {
f, err := os.Open("/etc/hosts")
if err != nil {
log.Fatal("Cannot open file: ", err)
}
err = doThings(f)
if err != nil {
log.Fatal("Error doing things: ", err)
}
}
僅當(dāng)傳入的內(nèi)容具有 name 方法(如 .如果沒(méi)有,那么您試圖做的事情是不可能的。*os.File

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
這是運(yùn)行時(shí)讀取器的讀取器,當(dāng)前端將文件發(fā)送到后端時(shí),它從網(wǎng)絡(luò)讀取文件。您必須根據(jù)請(qǐng)求本身進(jìn)行工作才能獲得該文件名。這是一個(gè)假設(shè),但在大多數(shù)情況下,對(duì)于文件上傳,請(qǐng)求是多部分請(qǐng)求。如果您有相同的情況,則可以讀取標(biāo)頭,通常用于標(biāo)識(shí)文件類型。Go Native具有解析細(xì)節(jié)的能力。你可以試試這個(gè) :io.ReadCloserContent-Dispositionhttp.Request
formFile, handler, err := r.FormFile("file") // read file from network with key "file"
defer formFile.Close()
fileName := handler.Filename // Get file name

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
您必須使用方法將其轉(zhuǎn)換為類型:Name
package main
import (
"io"
"os"
)
func open(name string) (io.ReadCloser, error) {
return os.Open(name)
}
func main() {
c, e := open("file.txt")
if e != nil {
panic(e)
}
defer c.Close()
f := c.(*os.File)
println(f.Name())
}
- 5 回答
- 0 關(guān)注
- 180 瀏覽
添加回答
舉報(bào)