当我尝试使用 React 下载时,Sinatra 发送带有“send_file”的损坏 .zip 文件
Sinatra sends damaged .zip file with `send_file` when I try to download with React
因此,在我的 Sinatra 项目中,我创建了一个包含一些歌曲的 .zip 文件,然后我想 return 该文件作为对 send_file
助手的响应。当我尝试在前端使用 React 下载文件时,它下载了一些东西,但它说它格式无效或已损坏。
这是我在 Sinatra 中的代码:
def download_songs(song_list)
time = Time.new
temp_dir_name = rand(100000..999999).to_s + time.strftime("%d%m%Y%H%M%S")
Dir.mkdir(temp_dir_name)
song_list.each { |song|
formatted_command = 'youtube-dl -o "' + __dir__.to_s + '/' + temp_dir_name + '/%(title)s.%(ext)s" -x --audio-format mp3 "ytsearch:' + song + '"'
system formatted_command
}
zipfile_name = "#{__dir__.to_s}/#{temp_dir_name}/YourSongs.zip"
folder_to_zip = "#{__dir__.to_s}/#{temp_dir_name}"
file_names = Dir.children(temp_dir_name)
Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
file_names.each do |filename|
zipfile.add(filename, File.join(folder_to_zip, filename))
end
end
file_to_send_to_front = "./" + temp_dir_name + "/YourSongs.zip"
send_file file_to_send_to_front, :filename => "YourSongs.zip", :type => 'application/octet-stream'
end
我在这段代码中调用了那个函数:
post '/download' do
content_type :json
all_songs_to_download = params['songs'].split(',')
download_songs(all_songs_to_download)
end
当它在服务器本地下载时。我可以正常打开它,所以我会说 Zip 没有被错误地创建,而是 React 错误地下载它或者 send_file
以错误的方式发送它。顺便说一句,我尝试以相同的方式发送一个普通的 README.md
文件并且它工作正常。
这是我用来下载 .zip 文件的 React 代码:
_downloadSongs = () => {
let data = new FormData();
data.append('songs', this.state.songs);
axios({
method: "POST",
url: 'http://localhost:4567/download',
data: data,
headers: {'Content-Type': 'multipart/form-data'}
}).then(res => {
fileDownload(res.data, 'YourSongs.zip');
}).catch(err => {
console.log(err)
})
}
注意:我正在使用 js-file-download 下载我从 Sinatra 收到的响应文件。
您是否尝试过在 send_file
中设置以下内容:
:type => 'application/zip',
:disposition => 'attachment'
因此,在我的 Sinatra 项目中,我创建了一个包含一些歌曲的 .zip 文件,然后我想 return 该文件作为对 send_file
助手的响应。当我尝试在前端使用 React 下载文件时,它下载了一些东西,但它说它格式无效或已损坏。
这是我在 Sinatra 中的代码:
def download_songs(song_list)
time = Time.new
temp_dir_name = rand(100000..999999).to_s + time.strftime("%d%m%Y%H%M%S")
Dir.mkdir(temp_dir_name)
song_list.each { |song|
formatted_command = 'youtube-dl -o "' + __dir__.to_s + '/' + temp_dir_name + '/%(title)s.%(ext)s" -x --audio-format mp3 "ytsearch:' + song + '"'
system formatted_command
}
zipfile_name = "#{__dir__.to_s}/#{temp_dir_name}/YourSongs.zip"
folder_to_zip = "#{__dir__.to_s}/#{temp_dir_name}"
file_names = Dir.children(temp_dir_name)
Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
file_names.each do |filename|
zipfile.add(filename, File.join(folder_to_zip, filename))
end
end
file_to_send_to_front = "./" + temp_dir_name + "/YourSongs.zip"
send_file file_to_send_to_front, :filename => "YourSongs.zip", :type => 'application/octet-stream'
end
我在这段代码中调用了那个函数:
post '/download' do
content_type :json
all_songs_to_download = params['songs'].split(',')
download_songs(all_songs_to_download)
end
当它在服务器本地下载时。我可以正常打开它,所以我会说 Zip 没有被错误地创建,而是 React 错误地下载它或者 send_file
以错误的方式发送它。顺便说一句,我尝试以相同的方式发送一个普通的 README.md
文件并且它工作正常。
这是我用来下载 .zip 文件的 React 代码:
_downloadSongs = () => {
let data = new FormData();
data.append('songs', this.state.songs);
axios({
method: "POST",
url: 'http://localhost:4567/download',
data: data,
headers: {'Content-Type': 'multipart/form-data'}
}).then(res => {
fileDownload(res.data, 'YourSongs.zip');
}).catch(err => {
console.log(err)
})
}
注意:我正在使用 js-file-download 下载我从 Sinatra 收到的响应文件。
您是否尝试过在 send_file
中设置以下内容:
:type => 'application/zip',
:disposition => 'attachment'