是否可以使用goroutine并行下载和保存文件?
以下是我的代码,可从我的保管箱下载文件:
package main
import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/url"
"os"
"path/filepath"
)
const app_key string = "<app_key>"
const app_secret string = "<app_secret>"
var code string
type TokenResponse struct {
AccessToken string `json:"access_token"`
}
type File struct {
Path string
}
type FileListResponse struct {
FileList []File `json:"contents"`
}
func download_file(file File, token TokenResponse) {
download_file := fmt.Sprintf("https://api-content.dropbox.com/1/files/dropbox/%s?access_token=%s", file.Path, token.AccessToken)
resp, _ := http.Get(download_file)
defer resp.Body.Close()
filename := filepath.Base(file.Path)
out, err := os.Create(filename)
if err != nil {
panic(err)
}
defer out.Close()
io.Copy(out, resp.Body)
}
func main() {
authorize_url := fmt.Sprintf("https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=%s", app_key)
// Get code
fmt.Printf("1. Go to: %s\n", authorize_url)
fmt.Println("2. Click 'Allow' (you might have to log in first)")
fmt.Println("3. Copy the authorization code.")
fmt.Printf("Enter the authorization code here: ")
fmt.Scanf("%s", &code)
// End get code
// Get access token
data := url.Values{}
data.Add("code", code)
data.Add("grant_type", "authorization_code")
data.Add("client_id", app_key)
data.Add("client_secret", app_secret)
resp, _ := http.PostForm("https://api.dropbox.com/1/oauth2/token", data)
defer resp.Body.Close()
contents, _ := ioutil.ReadAll(resp.Body)
var tr TokenResponse
json.Unmarshal(contents, &tr)
// End get access token
// Get file list
file_list_url := fmt.Sprintf("https://api.dropbox.com/1/metadata/dropbox/Camera Uploads?access_token=%s", tr.AccessToken)
resp2, _ := http.Get(file_list_url)
defer resp2.Body.Close()
contents2, _ := ioutil.ReadAll(resp2.Body)
var flr FileListResponse
json.Unmarshal(contents2, &flr)
// End get file list
for i, file := range flr.FileList {
download_file(file, tr)
if i >= 2 {
break
}
}
}
当我在go
命令前给download_file函数添加前缀时,它不起作用。
go download_file(file, tr)
那是因为您的主要goroutine正在退出。您需要添加一个WaitGroup以等待所有goroutines退出。例如,
var wg sync.WaitGroup
for i, file := range flr.FileList {
wg.Add(1)
go download_file(file, tr, wg)
if i >= 2 {
break
}
}
wg.Wait()
...
func download_file(file File, token TokenResponse, wg sync.WaitGroup) {
...
wg.Done()
}
本文向大家介绍golang并发下载多个文件的方法,包括了golang并发下载多个文件的方法的使用技巧和注意事项,需要的朋友参考一下 背景说明 假设有一个分布式文件系统,现需要从该系统中并发下载一部分文件到本地机器。 已知该文件系统的部分节点ip, 以及需要下载的文件fileID列表,并能通过这些信息来拼接下载地址。 其中节点ip列表保存在xx_node.txt, 要下载的fileID保存在xx_f
问题内容: 我正在尝试使用线程下载多个与模式匹配的文件。该模式可以匹配1或5或10个差异大小的文件。 为了简单起见,可以说下载文件的实际代码在downloadFile()方法中,而fileNames是与模式匹配的文件名列表。我该如何使用线程。每个线程将仅下载一个文件。建议在for循环内创建一个新线程。 问题答案: 您确实想使用ExecutorService而不是单个线程,它更干净,性能可能更高,并
我正在尝试下载https://occ.ca/our-publications 我的最终目标是解析PDF文件中的文本并定位某些关键字。 到目前为止,我已经能够抓取所有页面上PDF文件的链接。我已将这些链接保存到列表中。现在,我想浏览一下列表并用Python下载所有pdf文件。下载完文件后,我想对它们进行解析。 这是我迄今为止使用的代码: 这是我运行代码时遇到的错误。 回溯(最近的最后一次调用):ur
我正在尝试使用Spring Boot RestController下载多个pdf文件。但是由于某种原因,只下载了第一个文件。程序没有抛出任何错误。不确定是什么问题。这需要多部分吗?
问题内容: 如何使用php将多个文件下载为zip文件? 问题答案: 您可以使用该类创建一个ZIP文件并将其流式传输到客户端。就像是: 并流式传输: 第二行强制浏览器向用户显示一个下载框,并提示名称filename.zip。第三行是可选的,但某些(主要是较旧的)浏览器在某些情况下会出现问题,而未指定内容大小。
问题内容: 我有一个应用程序,该应用程序可以获取一些信息,使用pandas进行一些计算,然后将最终的熊猫数据框转换为CSV,然后使用Flask应用下载。如何在一个视图中下载多个CSV?看来我一次只能返回一个响应。 示例片段: 因此,让我们在上面的示例中说,make_calculation返回了两个pandas数据帧。如何将它们都打印为CSV? 问题答案: 这是你使用所需的全部代码。它将返回一个包含