如何在golang中检查URL是不是可下载?

Posted

技术标签:

【中文标题】如何在golang中检查URL是不是可下载?【英文标题】:How to check whether a URL is downloadable or not in golang?如何在golang中检查URL是否可下载? 【发布时间】:2021-12-13 09:19:44 【问题描述】:

我正在尝试将文件从 url 下载到本地文件。

我想测试请求的 url 是否只是文件,如果不是文件应该返回错误的请求

任何帮助都将不胜感激

package main
    
    import (
        "fmt"
        "io"
        "net/http"
        "os"
    )
    
    func main() 
        fileUrl := "http://example.com/file.txt"
        err := DownloadFile("./example.txt", fileUrl)
        if err != nil 
            panic(err)
        
        fmt.Println("Downloaded: " + fileUrl)
    
    
    // DownloadFile will download a url to a local file.
    func DownloadFile(filepath string, url string) error 
    
        // Get the data
        resp, err := http.Get(url)
        if err != nil 
            return err
        
        defer resp.Body.Close()
    
        // Create the file
        out, err := os.Create(filepath)
        if err != nil 
            return err
        
        defer out.Close()
    
        // Write the body to file
        _, err = io.Copy(out, resp.Body)
        return err
    

【问题讨论】:

URL 是一个 URL,而不是文件或文件夹。通过 HTTP GET 请求 URL 将产生字节流(响应)主体和 Content-Type 元数据(在 HTTP 标头中发送)。如果您将某对(body-data, content-type)视为“文件”或“文件夹”,则取决于您。 【参考方案1】:

以下是检查 URL 是否可下载的方法。希望这对某人有帮助:)

package main
            
import (
    "fmt"
    "io"
    "net/http"
    "os"
)
            
func main() 
    fileUrl := "http://example.com/file.txt"
    err := DownloadFile("./example.txt", fileUrl)
    if err != nil 
        panic(err)
    
    fmt.Println("Downloaded: " + fileUrl)

            
// DownloadFile will download a url to a local file.
func DownloadFile(filepath string, url string) error 
            
    // Get the data
    resp, err := http.Get(url)
    contentType = resp.Header.Get("Content-Type")  
        
    if err != nil 
         return err
    
    defer resp.Body.Close()
        
    if contentType == "application/octet-stream" 
        // Create the file
        out, err := os.Create(filepath)
        if err != nil 
            return err
        
        defer out.Close()
            
        // Write the body to file
        _, err = io.Copy(out, resp.Body)
        return err
     else 
        fmt.Println("Requested URL is not downloadable")
        return nil
    

【讨论】:

以上是关于如何在golang中检查URL是不是可下载?的主要内容,如果未能解决你的问题,请参考以下文章

检测链接是不是为可下载文件

NSURL 检查网页或可下载文件

CakePHP:如何控制对可下载文件的访问

如何检查您的网站是不是已在 iframe 中加载并获取父 URL? [复制]

如何在 django 中提供可下载的 zip 文件

windows客户端开发--根据可下载url另存为文件(微信windows客户端这样做的)