gpt4 book ai didi

android - 从 Android 客户端将图像存储到 Blobstore 并检索 blobkey 并上传 url 以存储在 Datastore 中。 -GAE

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:59:23 29 4
gpt4 key购买 nike

在我的 Android 应用程序中,我想将图像上传到 Blobstore,然后检索上传 url 和图像的 Blobkey,这样我就可以将 Blobkey 存储在 DataStore 中。

我试过这段代码,但我的图片没有上传:

Servlet(返回上传地址)

BlobstoreService blobstoreService = BlobstoreServiceFactory
.getBlobstoreService();
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {

UploadOptions uploadOptions = UploadOptions.Builder
.withGoogleStorageBucketName("photobucket11")
.maxUploadSizeBytes(1048576);
String blobUploadUrl = blobstoreService.createUploadUrl("/upload",
uploadOptions);

// String blobUploadUrl = blobstoreService.createUploadUrl("/uploaded");

resp.setStatus(HttpServletResponse.SC_OK);
resp.setContentType("text/plain");

PrintWriter out = resp.getWriter();
out.print(blobUploadUrl);

}

public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
doGet(req, resp);
}

代码:安卓客户端

Bitmap bmp = BitmapFactory.decodeFile(imagePath);
ByteArrayOutputStream out = new ByteArrayOutputStream();
bmp.compress(CompressFormat.JPEG, 75, out);
byte[] imgByte = out.toByteArray();
String encodedImage = Base64.encodeToString(imgByte,
Base64.DEFAULT);

HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(
"app-url/ImgUpload");
HttpResponse response = httpClient.execute(httpGet);
HttpEntity urlEntity = response.getEntity();
InputStream in = urlEntity.getContent();
String str = "";
while (true) {
int ch = in.read();
if (ch == -1)
break;
str += (char) ch;
}

这将以 /_ah/upload/akjdhjahdjaudshgaajsdhjsdh 的形式返回上传 url,我可以用它来存储图像。

此代码使用 url 来存储图像:

httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost(str);
ByteArrayBody bab = new ByteArrayBody(imgByte, "forest.jpg");

MultipartEntity reqEntity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);

reqEntity.addPart("uploaded", bab);
reqEntity.addPart("photoCaption", new StringBody("sfsdfsdf"));
postRequest.setEntity(reqEntity);
response = httpClient.execute(postRequest);

BufferedReader reader = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent(), "UTF-8"));
String sResponse;
StringBuilder s = new StringBuilder();

while ((sResponse = reader.readLine()) != null) {
s = s.append(sResponse);
}

在这里,如果我检查字符串 s 的值,它会显示 null。这意味着它返回一个空响应。我不知道这段代码有什么问题。请指导我解决这个问题。

最佳答案

经过多次尝试,我解决了这个问题。要将图像存储在 blobstore 中,首先 android 需要向 servlet 发出请求,servlet 将生成上传 url:

Android 客户端:它会请求生成 url 并从 servlet 中获取 url

HttpClient httpClient = new DefaultHttpClient();    
//This will invoke "ImgUpload servlet
HttpGet httpGet = new HttpGet("my-app-url/ImgUpload");
HttpResponse response = httpClient.execute(httpGet);
HttpEntity urlEntity = response.getEntity();
InputStream in = urlEntity.getContent();
String str = "";
while (true) {
int ch = in.read();
if (ch == -1)
break;
str += (char) ch;
}

ImgUpload.java - 用于生成 url 并向客户端发送响应的 Servlet

BlobstoreService blobstoreService = BlobstoreServiceFactory
.getBlobstoreService();
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {

//"uploaded" is another servlet which will send UploadUrl and blobkey to android client
String blobUploadUrl = blobstoreService.createUploadUrl("/uploaded");

resp.setStatus(HttpServletResponse.SC_OK);
resp.setContentType("text/plain");

PrintWriter out = resp.getWriter();
out.print(blobUploadUrl);
}

在android客户端中,编写下面的代码上传图片到从上面的servlet返回的响应。

//Save image to generated url
HttpPost httppost = new HttpPost(str);
File f = new File(imagePath);
FileBody fileBody = new FileBody(f);
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("file", fileBody);
httppost.setEntity(reqEntity);
response = httpClient.execute(httppost); //Here "uploaded" servlet is automatically invoked
urlEntity = response.getEntity(); //Response will be returned by "uploaded" servlet in JSON format
in = urlEntity.getContent();
str = "";
while (true) {
int ch = in.read();
if (ch == -1)
break;
str += (char) ch;
}
JSONObject resultJson = new JSONObject(str);
String blobKey = resultJson.getString("blobKey");
String servingUrl = resultJson.getString("servingUrl");

uploaded.java- 返回图片的 Uploadurl 和 Blobkey 的 servlet

BlobstoreService blobstoreService = BlobstoreServiceFactory
.getBlobstoreService();

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
try {
List<BlobKey> blobs = blobstoreService.getUploads(req).get("file");
BlobKey blobKey = blobs.get(0);

ImagesService imagesService = ImagesServiceFactory
.getImagesService();
ServingUrlOptions servingOptions = ServingUrlOptions.Builder
.withBlobKey(blobKey);

String servingUrl = imagesService.getServingUrl(servingOptions);

resp.setStatus(HttpServletResponse.SC_OK);
resp.setContentType("application/json");

JSONObject json = new JSONObject();

json.put("servingUrl", servingUrl);
json.put("blobKey", blobKey.getKeyString());

PrintWriter out = resp.getWriter();
out.print(json.toString());
out.flush();
out.close();
} catch (JSONException e) {

e.printStackTrace();
}

}

关于android - 从 Android 客户端将图像存储到 Blobstore 并检索 blobkey 并上传 url 以存储在 Datastore 中。 -GAE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22168930/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com