java - 如何在 Google App Engine 上写入文件?

标签 java google-app-engine google-cloud-datastore blobstore

我想以编程方式下载图像文件并将其保存在 Google App Engine 上。我可以看到有一个数据存储 API,因此我可以保存任何对象。

Entity e = new Entity("Kind");
e.setProperty("heigh",6);
DatastoreServiceFactory.getDatastoreService().put(e);

但我需要将下载的图像 (byte[]) 保存到某个位置,以便我可以在 HTML 上下文中引用,例如 src=static/image1.png。这听起来就像 Blobstore。

我找到了很多上传示例,但我不需要上传表单。所以我尝试编译一个 POST 就像文件 upload example 中一样,但我不工作。在 Google App Engine 上保存文件是否有更简单的解决方案(免费,因此不能选择云存储)?

URL surl = new URL("http://www.freeonlinegames.com/games/39779/medium.jpg");
byte[] byteArray = URLFetchServiceFactory.getURLFetchService().fetch(surl).getContent();
StringBuilder parameters = new StringBuilder();

parameters.append("--BOUNDARY");
parameters.append("\nContent-Disposition: form-data; name=\"file\"; filename\"test.png\"\n");
parameters.append("Content-Type: image/jpg\n\n");

parameters.append(new String(byteArray));
parameters.append("\n--BOUNDARY\n");

String request = BlobstoreServiceFactory.getBlobstoreService().createUploadUrl("/upload");


URL durl = new URL(request);
log("upload: " + durl.toString());

HttpURLConnection connection = (HttpURLConnection) durl.openConnection();           
connection.setDoOutput(true);
connection.setDoInput(true);

connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=--BOUNDARY");
connection.setRequestProperty("Content-Length",Integer.toString(parameters.toString().getBytes().length));
connection.setRequestProperty("Cache-Control","max-age=0");
                    connection.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
connection.setRequestProperty("Accept-Encoding","gzip,deflate,sdch");                   

DataOutputStream wr = new DataOutputStream(connection.getOutputStream ());

wr.writeBytes(parameters.toString());

wr.flush();
wr.close();

BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
byte[] bkey = new byte[512];
bis.read(bkey);
log("resp: " + new String(bkey));

最佳答案

免费解决方案:

  • 如果图像小于 1MB,您可以将字节存储到数据存储区。
  • 您始终可以通过 API 使用第三方免费图像托管解决方案

付费解决方案:

否则,Google 建议您改用 Google Cloud Storage https://cloud.google.com/products/cloud-storage/

直接写入 blobstore 已被弃用 https://developers.google.com/appengine/docs/java/blobstore/#Java_Writing_files_to_the_Blobstore

关于java - 如何在 Google App Engine 上写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23254183/

相关文章:

android - 用于读取 apk 文件的 Java 库(用于构建类似应用程序的 Play 商店)

javascript - Angular Js 和 google api client.js (gapi)

jquery - 最好的Python库来清理标签(不安全),并保留我认为安全的标签

java - 将列添加到 csv 并包含值

java - Class.forName 未从指定目录加载数据

google-app-engine - Google App Engine 无法提供某些 mp4 文件

python - 迁移到 GAE

google-app-engine - 具有相同 ID 的多个数据存储实体!

google-app-engine - App Engine 数据存储区 - 开发服务器限制

java - 告诉我Android Studios简单语法错误的解决办法