我需要将文件上传到第三方服务。这些文件是在Google云端硬盘上创建的,我会获取它的blob数据。
我想创建一个多部分请求,当我执行UrlFetchApp Post时,它现在看起来像这样。
这是作为字符串的有效负载。我有一些生成有效负载的代码。正确格式化它不是问题,它应该是它的格式。
-----------------0.13accb4c42d338
Content-Disposition: form-data; name="source"; filename="Zzapps.jpg"
Content-Type: application/octet-stream
[[[IMAGE DATA HERE -- OMITTED FOR BREVITY]]]
-----------------0.13accb4c42d338
Content-Disposition: form-data; name="filename"
Zzapps.jpg
-----------------0.13accb4c42d338--
这是执行UrlFetchApp命令的代码段。
var authHeaders = {
Authorization: 'OAuth2 '+access_token
}
var params = {
accept: "application/json",
method: 'POST',
payload: payload,
contentType: 'multipart/form-data; boundary='+boundaryKey,
headers: authHeaders,
ContentLength: payload.length,
muteHttpExceptions: true
}
var resx = UrlFetchApp.fetch(url,params);
接收方发出错误(缺少来源)。我不确定我的多部分帖子在第一时间是否合适,我找不到任何测试网址来检查我是否正确上传。
如何以正确的方式发送blob-data作为分段上传? 现在我使用blob.getDataAsString()< - 这是正确的吗?
答案 0 :(得分:1)
如果您自己构建有效负载字符串,则要执行blob.getBytes(),而不是blob.getDataAsString()。
但是,有一种更简单的方法。无需自己构建有效负载字符串,您只需将一个javascript对象设置为有效负载,UrlFetchApp将自动生成适当的有效负载字符串,选择正确的内容类型,边界和大多数其他选项。只需将HTML表单输入字段的“名称”属性用作对象键即可。对于文件,请使用blob作为键的值。
function sendReportToSteve() {
var url = "https://example.com/stevedore.html";
var form = {
date : new Date(),
subject : "Happy birthday!",
comment : "quakehashprismkeepkick",
attachment1 : DriveApp.getFileById("sH1proy0lradArgravha9ikE").getBlob(),
attachment2 : DriveApp.getFileById("traCetRacErI3hplVnkFax").getBlob()
};
uploadFile(url,form);
}
function uploadFile(url,form) {
var options = {
method : "POST",
payload : form
};
var request = UrlFetchApp.getRequest(url,options); // (OPTIONAL) generate the request so you
console.info("Request payload: " + request.payload); // can examine it (useful for debugging)
var response = UrlFetchApp.fetch(url,options);
console.info("Response body: " + response.getContentText());
}