解析 Android 无法下载永久移动错误的图像
Parse Android fails to download image with a moved permanently error
尝试使用 getData()
方法下载 ParseFile 时出现以下异常。
com.parse.ParseException: Download from S3 failed. Moved Permanently
at com.parse.ParseAWSRequest.onResponseAsync(ParseAWSRequest.java:43)
at com.parse.ParseRequest.then(ParseRequest.java:137)
at com.parse.ParseRequest.then(ParseRequest.java:133)
at bolts.Task.run(Task.java:917)
at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:105)
at bolts.Task.completeAfterTask(Task.java:908)
at bolts.Task.continueWithTask(Task.java:715)
at bolts.Task.continueWithTask(Task.java:726)
at bolts.Task.then(Task.java:818)
at bolts.Task.then(Task.java:806)
at bolts.Task.run(Task.java:917)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
ParseFile 是上传的 jpg,然后放入名为 ImageObject
的 ParseObject 中。 ImageObject
有几个其他参数,如标题、宽度、高度,可以正确上传和下载。图像本身通过仪表板确认正确上传。仅在下载期间出现上述异常。
这是我的上传代码
file.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
Log.d(tag, "Successfully uploaded image file");
ParseObject image = new ParseObject("imageObject"); //Create new Image-ParseObject and set values
image.put("author", ParseUser.getCurrentUser());
image.put("imageFile", file);
image.put("caption", caption);
image.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if(e==null){
Log.d(tag, "Successfully saved image file to object");
}else{
Log.d(tag, "Failed to save image file to object", e);
}
}
});
} else {
Log.d(tag, "Failed to save image", e);
}
}
在我通过 ParseQuery 检索了所有 ImageObjects
之后,我的下载代码差不多 ParseFile.getFile()
。
我按照 ParseAWSRequest.java 的第 43 行找到了这个,
if (statusCode >= 200 && statusCode < 300 || statusCode == 304) {
// OK
} else {
String action = method == ParseHttpRequest.Method.GET ? "Download from" : "Upload to";
return Task.forError(new ParseException(ParseException.CONNECTION_FAILED, String.format(
"%s S3 failed. %s", action, response.getReasonPhrase())));
}
这和 "Permanently removed" 指向我的 nginx 反向代理,其中 returns 重定向到 https 的 301 代码。不幸的是,我不确定从哪里开始。
额外信息,
我已经在防火墙中阻止了端口 80(http) 进行测试,似乎下载 parse-android-sdk 正在尝试从 http 下载。这很奇怪,因为我用 "https" 指定了我的 parse-server link,而且上传工作正常。我可以在我的服务器上使用仪表板查看上传的图像。
正在使用,
- 解析服务器 2.2.13
- 解析Android SDK 1.13.1
- 解析仪表板 1.0.14
我通过直接下载文件找到了解决此问题的方法。我使用 ParseFile.getUrl()
方法获取 url 然后使用它来下载和使用文件。
在我的例子中是 .jpg
个文件。然后我使用了一个外部库来处理所有 downloading/caching/loading 到图像视图中。
这两个库都运行良好
尝试使用 getData()
方法下载 ParseFile 时出现以下异常。
com.parse.ParseException: Download from S3 failed. Moved Permanently
at com.parse.ParseAWSRequest.onResponseAsync(ParseAWSRequest.java:43)
at com.parse.ParseRequest.then(ParseRequest.java:137)
at com.parse.ParseRequest.then(ParseRequest.java:133)
at bolts.Task.run(Task.java:917)
at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:105)
at bolts.Task.completeAfterTask(Task.java:908)
at bolts.Task.continueWithTask(Task.java:715)
at bolts.Task.continueWithTask(Task.java:726)
at bolts.Task.then(Task.java:818)
at bolts.Task.then(Task.java:806)
at bolts.Task.run(Task.java:917)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
ParseFile 是上传的 jpg,然后放入名为 ImageObject
的 ParseObject 中。 ImageObject
有几个其他参数,如标题、宽度、高度,可以正确上传和下载。图像本身通过仪表板确认正确上传。仅在下载期间出现上述异常。
这是我的上传代码
file.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
Log.d(tag, "Successfully uploaded image file");
ParseObject image = new ParseObject("imageObject"); //Create new Image-ParseObject and set values
image.put("author", ParseUser.getCurrentUser());
image.put("imageFile", file);
image.put("caption", caption);
image.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if(e==null){
Log.d(tag, "Successfully saved image file to object");
}else{
Log.d(tag, "Failed to save image file to object", e);
}
}
});
} else {
Log.d(tag, "Failed to save image", e);
}
}
在我通过 ParseQuery 检索了所有 ImageObjects
之后,我的下载代码差不多 ParseFile.getFile()
。
我按照 ParseAWSRequest.java 的第 43 行找到了这个,
if (statusCode >= 200 && statusCode < 300 || statusCode == 304) {
// OK
} else {
String action = method == ParseHttpRequest.Method.GET ? "Download from" : "Upload to";
return Task.forError(new ParseException(ParseException.CONNECTION_FAILED, String.format(
"%s S3 failed. %s", action, response.getReasonPhrase())));
}
这和 "Permanently removed" 指向我的 nginx 反向代理,其中 returns 重定向到 https 的 301 代码。不幸的是,我不确定从哪里开始。
额外信息, 我已经在防火墙中阻止了端口 80(http) 进行测试,似乎下载 parse-android-sdk 正在尝试从 http 下载。这很奇怪,因为我用 "https" 指定了我的 parse-server link,而且上传工作正常。我可以在我的服务器上使用仪表板查看上传的图像。
正在使用,
- 解析服务器 2.2.13
- 解析Android SDK 1.13.1
- 解析仪表板 1.0.14
我通过直接下载文件找到了解决此问题的方法。我使用 ParseFile.getUrl()
方法获取 url 然后使用它来下载和使用文件。
在我的例子中是 .jpg
个文件。然后我使用了一个外部库来处理所有 downloading/caching/loading 到图像视图中。
这两个库都运行良好