Мобильный бэкэнд-стартер – добавьте в AppEngine Blobstore

Как загружать файлы с Android на Google App Engine Blobstore с помощью Mobile Backend Starter или Google Cloud Endpoints?

Разделите мой опыт с Mobile Backend Starter.

Чтобы загрузить и загрузить URL-адреса, вам необходимо добавить этот два метода в класс CloudBackend.java чтобы сделать доступными URL-адреса из Activity:

 public String getUploadBlobURL(String bucketName, String path, String accessMode) { String url = null; try { url = getMBSEndpoint().blobEndpoint() .getUploadUrl(bucketName, path, accessMode).execute() .getShortLivedUrl(); } catch (IOException e) { e.printStackTrace(); } return url; } public String getDownloadBlobURL(String bucketName, String path) { String url = null; try { url = getMBSEndpoint().blobEndpoint() .getDownloadUrl(bucketName, path).execute() .getShortLivedUrl(); } catch (IOException e) { e.printStackTrace(); } return url; } 

Затем вы можете использовать URL-адреса для передачи байтов в Google Cloud Storage с помощью стандартных клиентских библиотек.

Ниже я расскажу вам, как их использовать.

Для загрузки файла в Google Cloud Storage вы можете использовать что-то похожее на это:

Мероприятия

 File fileUp = new File(Environment.getExternalStorageDirectory(), fileName); new AsyncBlobUploader(this, mProcessingFragment.getCloudBackend()).execute(fileUp); 

AsyncTask

 public class AsyncBlobUploader extends AsyncTask<File, Void, String> { private Context context; private ProgressDialog pd; private CloudBackend cb; public AsyncBlobUploader(Context context, CloudBackend cb) { this.context = context; this.cb = cb; } @Override protected void onPreExecute() { super.onPreExecute(); pd = ProgressDialog.show(context, null, "Loading... Please wait..."); pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); pd.setIndeterminate(true); pd.setCancelable(true); pd.show(); } protected String doInBackground(File... files) { File file = files[0]; String uploadUrl = cb.getUploadBlobURL(bucketName, file.getName(),"PUBLIC_READ_FOR_APP_USERS"); String url = uploadUrl.split("&Signature")[0]; // url without Signature HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); FileBody filebody = new FileBody(file,ContentType.create(getMimeType(file .toString())), file.getName()); MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create(); multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); multipartEntity.addPart("file", filebody); httppost.setEntity(multipartEntity.build()); System.out.println( "executing request " + httppost.getRequestLine( ) ); try { HttpResponse response = httpclient.execute( httppost ); Log.i("response", response.getStatusLine().toString()); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } httpclient.getConnectionManager( ).shutdown( ); return (String) uploadUrl; } protected void onPostExecute(String result) { pd.dismiss(); Log.d("BlobUrl", result); } public static String getMimeType(String url) { String type = null; String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (extension != null) { MimeTypeMap mime = MimeTypeMap.getSingleton(); type = mime.getMimeTypeFromExtension(extension); } return type; } } 

Класс MultipartEntityBuilder не включен в стандартные библиотеки Android, поэтому вам необходимо загрузить httpclient и включить его в свой проект.

Обратите внимание на эту строку String url = uploadUrl.split("&Signature")[0]; Где я сокращаю подпись подписи. (С сигнатурой url я получаю 503 Internal Server Error но без нее все работает так, как ожидалось. Я не понимаю, почему это происходит.)

Для загрузки вы можете использовать этот фрагмент:

Мероприятия

 File fileDown = new File(Environment.getExternalStorageDirectory(), fileName); //file to create new AsyncBlobDownloader(imageView, mProcessingFragment.getCloudBackend()) .execute(fileDown); 

AsyncTask

 public class AsyncBlobDownloader extends AsyncTask<File, Integer, File> { private ImageView imageView; private ProgressDialog pd; private CloudBackend cb; public AsyncBlobDownloader(ImageView imageView, CloudBackend cb) { this.imageView = imageView; this.cb = cb; } @Override protected void onPreExecute() { super.onPreExecute(); pd = ProgressDialog.show(imageView.getContext(), null, "Loading... Please wait..."); pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); pd.setCancelable(true); pd.show(); } protected File doInBackground(File... files) { File file = files[0]; String downloadUrl = cb.getDownloadBlobURL(bucketName, file.getName()); InputStream input = null; OutputStream output = null; HttpURLConnection connection = null; try { URL url = new URL(downloadUrl); connection = (HttpURLConnection) url.openConnection(); connection.connect(); if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { Log.i("Response", "Server returned HTTP " + connection.getResponseCode() + " " + connection.getResponseMessage()); } int fileLength = connection.getContentLength(); input = connection.getInputStream(); output = new FileOutputStream(file); byte data[] = new byte[4096]; int count; while ((count = input.read(data)) != -1) { if (isCancelled()) { input.close(); return null; } output.write(data, 0, count); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (output != null) output.close(); if (input != null) input.close(); } catch (IOException ignored) { } if (connection != null) connection.disconnect(); } return file; } protected void onPostExecute(File result) { pd.dismiss(); imageView.setImageURI(Uri.fromFile(result)); } } 

ПРИМЕЧАНИЕ. Чтобы использовать Google Cloud Storage, вам необходимо включить выставление счетов. Также вам нужно создать ковш в GCS.