无法使用 tileset Uploads API 将本地 json 文件上传到 mapbox
Unable to upload local json file to mapbox using tileset Uploads API
我正在按照 this Mapbox Uploads API documentation 中给出的步骤通过 API 将本地 json 文件上传到 Mapbox。我为此创建了 C# 控制台应用程序。
我能够获得 Mapbox 临时 s3 凭据,但是当我尝试使用这些临时 mapbox 凭据将文件上传到 s3 时,出现以下错误:
The AWS Access Key Id you provided does not exist in our records.
下面是我的控制台应用程序代码:
class Program
{
static void Main(string[] args)
{
var getS3AccessDetailsUrl = @"https://api.mapbox.com/uploads/v1/{my_mapbox_username}/credentials?access_token=my_mapbox_access_token";
var res = "";
var request = (HttpWebRequest)WebRequest.Create(getS3AccessDetailsUrl);
request.AutomaticDecompression = DecompressionMethods.GZip;
using (var response = (HttpWebResponse)request.GetResponse())
using (var stream = response.GetResponseStream())
if (stream != null)
using (var reader = new StreamReader(stream))
{
res = reader.ReadToEnd();
// Here I am successfully getting all the temp S3 details of Mapbox.
var mbS3Credentials = JObject.Parse(res);
var accessKeyId = (string)mbS3Credentials["accessKeyId"];
var bucket = (string)mbS3Credentials["bucket"];
var secretAccessKey = (string)mbS3Credentials["secretAccessKey"];
var url = (string)mbS3Credentials["url"];
var amazonS3Uploader = new AmazonS3Uploader(accessKeyId, secretAccessKey, url);
var localFilePath = "c:\users\saurabh\documents\visual studio 2015\Projects\MapboxTileSetUpload\MapboxTileSetUpload\data\geoFile.json";
var newFileName = "testFile";
amazonS3Uploader.UploadFile(localFilePath, bucket, newFileName, false);
}
Console.WriteLine(res);
}
}
public class AmazonS3Uploader
{
private readonly AmazonS3Client _s3Client;
public AmazonS3Uploader(string accessKeyId, string secretAccessKey, string serviceUrl)
{
var s3Config = new AmazonS3Config
{
ServiceURL = serviceUrl,
RegionEndpoint = RegionEndpoint.USEast1,
ForcePathStyle = true,
};
_s3Client = new AmazonS3Client(accessKeyId, secretAccessKey, s3Config);
}
public void UploadFile(string filePath, string s3BucketName, string newFileName, bool deleteLocalFileOnSuccess)
{
//save in s3
var s3PutRequest = new PutObjectRequest
{
FilePath = filePath,
BucketName = s3BucketName,
CannedACL = S3CannedACL.PublicRead
};
//key - new file name
if (!string.IsNullOrWhiteSpace(newFileName))
{
s3PutRequest.Key = newFileName;
}
s3PutRequest.Headers.Expires = new DateTime(2020, 1, 1);
try
{
var s3PutResponse = this._s3Client.PutObject(s3PutRequest);
if (deleteLocalFileOnSuccess)
{
//Delete local file
if (File.Exists(filePath))
{
File.Delete(filePath);
}
}
}
catch (Exception ex)
{
//gets exception here:
//The AWS Access Key Id you provided does not exist in our records.
}
}
}
好的,所以我传递了错误的密钥并且没有设置 sessionToken。根据我所做的更改,它现在正在运行:
...
var key = (string)mbS3Credentials["key"];
var sessionToken = (string)mbS3Credentials["sessionToken"];
...
var amazonS3Uploader = new AmazonS3Uploader(accessKeyId, secretAccessKey, sessionToken, url);
...
public AmazonS3Uploader(string accessKeyId, string secretAccessKey, string sessionToken, string serviceUrl)
{
var s3Config = new AmazonS3Config
{
ServiceURL = serviceUrl,
RegionEndpoint = RegionEndpoint.USEast1,
ForcePathStyle = true,
};
_s3Client = new AmazonS3Client(accessKeyId, secretAccessKey, sessionToken, s3Config);
}
public void UploadFile(string filePath, string s3BucketName, string key, string newFileName, bool deleteLocalFileOnSuccess)
{
//save in s3
var s3PutRequest = new PutObjectRequest
{
FilePath = filePath,
BucketName = s3BucketName,
Key = key,
CannedACL = S3CannedACL.PublicRead
};
//key - new file name
//if (!string.IsNullOrWhiteSpace(newFileName))
//{
// s3PutRequest.Key = newFileName;
//}
我正在按照 this Mapbox Uploads API documentation 中给出的步骤通过 API 将本地 json 文件上传到 Mapbox。我为此创建了 C# 控制台应用程序。
我能够获得 Mapbox 临时 s3 凭据,但是当我尝试使用这些临时 mapbox 凭据将文件上传到 s3 时,出现以下错误:
The AWS Access Key Id you provided does not exist in our records.
下面是我的控制台应用程序代码:
class Program
{
static void Main(string[] args)
{
var getS3AccessDetailsUrl = @"https://api.mapbox.com/uploads/v1/{my_mapbox_username}/credentials?access_token=my_mapbox_access_token";
var res = "";
var request = (HttpWebRequest)WebRequest.Create(getS3AccessDetailsUrl);
request.AutomaticDecompression = DecompressionMethods.GZip;
using (var response = (HttpWebResponse)request.GetResponse())
using (var stream = response.GetResponseStream())
if (stream != null)
using (var reader = new StreamReader(stream))
{
res = reader.ReadToEnd();
// Here I am successfully getting all the temp S3 details of Mapbox.
var mbS3Credentials = JObject.Parse(res);
var accessKeyId = (string)mbS3Credentials["accessKeyId"];
var bucket = (string)mbS3Credentials["bucket"];
var secretAccessKey = (string)mbS3Credentials["secretAccessKey"];
var url = (string)mbS3Credentials["url"];
var amazonS3Uploader = new AmazonS3Uploader(accessKeyId, secretAccessKey, url);
var localFilePath = "c:\users\saurabh\documents\visual studio 2015\Projects\MapboxTileSetUpload\MapboxTileSetUpload\data\geoFile.json";
var newFileName = "testFile";
amazonS3Uploader.UploadFile(localFilePath, bucket, newFileName, false);
}
Console.WriteLine(res);
}
}
public class AmazonS3Uploader
{
private readonly AmazonS3Client _s3Client;
public AmazonS3Uploader(string accessKeyId, string secretAccessKey, string serviceUrl)
{
var s3Config = new AmazonS3Config
{
ServiceURL = serviceUrl,
RegionEndpoint = RegionEndpoint.USEast1,
ForcePathStyle = true,
};
_s3Client = new AmazonS3Client(accessKeyId, secretAccessKey, s3Config);
}
public void UploadFile(string filePath, string s3BucketName, string newFileName, bool deleteLocalFileOnSuccess)
{
//save in s3
var s3PutRequest = new PutObjectRequest
{
FilePath = filePath,
BucketName = s3BucketName,
CannedACL = S3CannedACL.PublicRead
};
//key - new file name
if (!string.IsNullOrWhiteSpace(newFileName))
{
s3PutRequest.Key = newFileName;
}
s3PutRequest.Headers.Expires = new DateTime(2020, 1, 1);
try
{
var s3PutResponse = this._s3Client.PutObject(s3PutRequest);
if (deleteLocalFileOnSuccess)
{
//Delete local file
if (File.Exists(filePath))
{
File.Delete(filePath);
}
}
}
catch (Exception ex)
{
//gets exception here:
//The AWS Access Key Id you provided does not exist in our records.
}
}
}
好的,所以我传递了错误的密钥并且没有设置 sessionToken。根据我所做的更改,它现在正在运行:
...
var key = (string)mbS3Credentials["key"];
var sessionToken = (string)mbS3Credentials["sessionToken"];
...
var amazonS3Uploader = new AmazonS3Uploader(accessKeyId, secretAccessKey, sessionToken, url);
...
public AmazonS3Uploader(string accessKeyId, string secretAccessKey, string sessionToken, string serviceUrl)
{
var s3Config = new AmazonS3Config
{
ServiceURL = serviceUrl,
RegionEndpoint = RegionEndpoint.USEast1,
ForcePathStyle = true,
};
_s3Client = new AmazonS3Client(accessKeyId, secretAccessKey, sessionToken, s3Config);
}
public void UploadFile(string filePath, string s3BucketName, string key, string newFileName, bool deleteLocalFileOnSuccess)
{
//save in s3
var s3PutRequest = new PutObjectRequest
{
FilePath = filePath,
BucketName = s3BucketName,
Key = key,
CannedACL = S3CannedACL.PublicRead
};
//key - new file name
//if (!string.IsNullOrWhiteSpace(newFileName))
//{
// s3PutRequest.Key = newFileName;
//}