我有一个反应设置,我正在使用超级代理将文件上传到google存储桶。该请求使用签名的url发送到存储桶,如下所示。第一部分是我们如何使用Filereader并从服务器获取签名的URL,第二部分是超级代理随后如何发出放置请求以将文件放入存储桶中。
const file = this.props.file
const reader = new FileReader()
reader.onload = () => {
uploadService
.getSignedURLs({
files: [
{
fileName: file.name,
contentType: file.type
}
]
})
.then(
response => {
this.setState({
urls: response.signed.map(function(data) {
data['file'] = file
return data
})
})
},
error => {
// handleError
}
)
}
reader.readAsBinaryString(file)
稍后,在等待FileReader加载的单独函数中,我们执行以下操作,其中从服务器返回的标头是:
headers = {
'Access-Control-Request-Header': 'Content-Type',
'Content-Type': content_type,
'Access-Control-Allow-Origin': access_control_allow_origin
}
...
self = this;
request
.put(url)
.set(headers)
.attach(fileName, file)
.on('progress', event => self.updateProgress(event.percent))
.end((err, res) => {
if (!err) {
self.reportSuccess(fileName, endLocation)
self.setState({ success: true, uploading: false })
} else {
self.setState({ uploading: false, fail: true })
}
})
问题是放入存储桶中的视频文件格式错误。即使它们与原始尺寸相同,也不会播放。我在上传的文件上运行了ffprobe,它说:
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fcddd804c00]格式 仅以低分1检测到mov,mp4,m4a,3gp,3g2,mj2 可能会误检测! [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fcddd804c00] moov 找不到原子/path/to/file.mov:处理时发现无效数据 输入
原件上写着:
元数据: major_brand:mp42 minor_version:0 compatible_brands:isommp42 creation_time:2018-09-08T05:16:54.000000Z持续时间:00:00:26.77,开始:0.000000,比特率:9094 kb / s 流#0:0(und):视频:h264(高)(avc1 / 0x31637661),yuv420p(tv,bt709),1920x1080 [SAR 1:1 DAR 16:9],9020 kb / s,30 fps, 30吨,15360吨,60吨(默认) 元数据: handler_name:VideoHandler 流#0:1(und):音频:aac(LC)(mp4a / 0x6134706D),44100 Hz,单声道,fltp,95 kb / s(默认) 元数据: creation_time:2018-09-09T23:00:53.000000Z handler_name:IsoMedia文件,由Google制作,2011年5月11日
我通过加载文件,然后立即将其保存(使用此便捷功能-https://stackoverflow.com/a/30832210/592419)到本地,从而进行了进一步的测试,以查看它是否为FileReader。没问题,这让我认为问题一定出在Put请求中。
答案 0 :(得分:0)
这里的答案是不使用import SwiftUI
struct HomeButton<Content>: View where Content: View {
init(destination: Content, icon: String, title: String, description: String, color: Color, width: Length = .zero) {
self.destination = destination
self.icon = icon
self.title = title
self.description = description
self.color = color
self.width = width
}
let destination: Content
let icon: String
let title: String
let description: String
let color: Color
let width: Length
var body: some View {
NavigationLink(destination: destination) {
Group {
ZStack {
Circle()
.foregroundColor(color)
.frame(width: 60, height: 60)
Text(icon)
.font(.system(size: 55))
.offset(x: -25, y: 20)
}.offset(x: 12.5, y: 0)
VStack {
Text(title)
.fontWeight(.bold)
.accentColor(.black)
Text(description)
.accentColor(.black)
}.padding(.top, 0)
}
.frame(width: width == .zero ? nil : width)
.padding(.top, 30)
.padding(.bottom, 30)
.padding(.leading, 45)
.padding(.trailing, 45)
}
.background(
Color.white
.cornerRadius(6)
.shadow(color: Color.lightGray, radius: 20))
}
}
,而是使用attach
。前者会分段上传,并且不会保留元数据。