> 백엔드 개발 > Golang > Golang에서 파일 전송 기능을 구현하는 방법

Golang에서 파일 전송 기능을 구현하는 방법

PHPz
풀어 주다: 2023-03-29 15:04:18
앞으로
798명이 탐색했습니다.
이 글은 주로 Golang의 파일 전송 기능을 자세하게 소개하고 있습니다. 글에 있는 샘플 코드가 아주 자세하게 소개되어 있고 관심 있는 친구들이 참고할 수 있습니다

이 글의 예시는 참고를 위해 Golang의 파일 전송을 위한 구체적인 코드를 공유합니다. 구체적인 내용은 다음과 같습니다.

TCP를 사용하여 파일 전송을 완료하는 방법은 다음과 같습니다.

1. 서버 파일 이름에 서버는 파일 이름을 저장합니다.

2. 수신자(서버)는 파일 이름이 성공적으로 저장되었음을 확인하기 위해 클라이언트에게 ok 메시지를 반환합니다.

3. 메시지를 받은 후 보낸 사람(클라이언트)은 파일 데이터를 서버로 보내기 시작합니다.

4. 수신자(서버)는 파일 내용을 읽고 이전에 저장된 파일에 씁니다.

Golang에서 파일 전송 기능을 구현하는 방법

먼저 파일 이름을 알아보세요. 파일 속성 정보를 얻으려면 os 패키지의 stat() 함수를 사용하십시오. 함수에서 반환된 파일 속성에 파일 이름과 파일 크기를 포함합니다. Stat 매개변수 이름은 파일 액세스의 절대 경로로 전달됩니다. FileInfo의 Name() 함수를 사용하면 파일 이름을 별도로 추출할 수 있습니다.

func Stat(name string) (FileInfo, error) 
type FileInfo interface {
   Name() string       
   Size() int64        
   Mode() FileMode     
   ModTime() time.Time 
   IsDir() bool        
   Sys() interface{}   
}
로그인 후 복사

Sender:

package main
 
import (
    "fmt"
    "io"
    "net"
    "os"
)
 
func sendFile(conn net.Conn, filePath string) {
    // 只读打开文件
    f, err := os.Open(filePath)
    if err != nil {
        fmt.Println("os.Open err:", err)
        return
    }
    defer f.Close()
 
    // 从本文件中,读数据,写给网络接收端。 读多少,写多少。原封不动。
    buf := make([]byte, 1024)
    for {
        n, err := f.Read(buf)
        if err != nil {
            if err == io.EOF {
                fmt.Println("发送文件完成。")
            } else {
                fmt.Println("os.Open err:", err)
            }
            return
        }
        // 写到网络socket中
        _, err = conn.Write(buf[:n])
        if err != nil {
            fmt.Println("conn.Write err:", err)
            return
        }
    }
}
 
func main() {
    list := os.Args // 获取命令行参数
 
    if len(list) != 2 {
        fmt.Println("格式为:go run xxx.go 文件绝对路径")
        return
    }
    // 提取 文件的绝对路径
    filePath := list[1]
 
    //提取文件名
    fileInfo, err := os.Stat(filePath)
    if err != nil {
        fmt.Println("os.Stat err:", err)
        return
    }
    fileName := fileInfo.Name()
 
    // 主动发起连接请求
    conn, err := net.Dial("tcp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println("net.Dial err:", err)
        return
    }
    defer conn.Close()
 
    // 发送文件名给 接收端
    _, err = conn.Write([]byte(fileName))
    if err != nil {
        fmt.Println("conn.Write err:", err)
        return
    }
    // 读取服务器回发的 OK
    buf := make([]byte, 1024)
    n, err := conn.Read(buf)
    if err != nil {
        fmt.Println("conn.Read err:", err)
        return
    }
 
    if "ok" == string(buf[:n]) {
        // 写文件内容给服务器——借助conn
        sendFile(conn, filePath)
    }
}
로그인 후 복사

Receiver:

package main
 
import (
    "fmt"
    "net"
    "os"
)
 
func recvFile(conn net.Conn, fileName string) {
    // 按照文件名创建新文件
    f, err := os.Create(fileName)
    if err != nil {
        fmt.Println("os.Create err:", err)
        return
    }
    defer f.Close()
 
    // 从 网络中读数据,写入本地文件
    buf := make([]byte, 1024)
    for {
        n, _ := conn.Read(buf)
        if n == 0 {
            fmt.Println("接收文件完成。")
            return
        }
        // 写入本地文件,读多少,写多少。
        f.Write(buf[:n])
    }
}
 
func main() {
    // 创建用于监听的socket
    listener, err := net.Listen("tcp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println(" net.Listen err:", err)
        return
    }
    defer listener.Close()
 
    fmt.Println("接收端启动成功,等待发送端发送文件!")
 
    // 阻塞监听
    conn, err := listener.Accept()
    if err != nil {
        fmt.Println(" listener.Accept() err:", err)
        return
    }
    defer conn.Close()
 
    // 获取文件名,保存
    buf := make([]byte, 1024)
    n, err := conn.Read(buf)
    if err != nil {
        fmt.Println(" conn.Read err:", err)
        return
    }
    fileName := string(buf[:n])
 
    // 回写 ok 给发送端
    conn.Write([]byte("ok"))
 
    // 获取文件内容
    recvFile(conn, fileName)
}
로그인 후 복사

위 내용은 이 글의 전체 내용이므로, 모든 분들의 공부에 도움이 되길 바랍니다.

추천 학습: "go 비디오 튜토리얼"

위 내용은 Golang에서 파일 전송 기능을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿