Я пытаюсь реализовать очень базовую функциональность загрузки изображений с Android, iPhone и веб-клиентов в движок Google. Благодаря этому блогу я сделал начальную версию реализации:
Однако для загрузки изображения всегда есть 2-этапный процесс:
public class CreateUploadUrl extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); String uploadURL = blobstoreService.createUploadUrl("/image/uploadImage"); resp.setContentType("text/plain"); resp.getWriter().println(uploadURL); } }
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { BlobKey blobKey = ParameterExtractor.getBlobParameter(req, "blob-key", blobstoreService); if (blobKey == null) { log.info("blob Id is null. POST failed"); } else { log.info("ze business logic"); } }
Мой вопрос в том, можно ли сделать это за один шаг, так как прямо сейчас все клиенты должны сделать http GET, чтобы получить URL-адрес для загрузки, а затем http POST для отправки изображения.
Невозможно просто сделать один Http POST с предопределенным URL.
Спасибо Раджату
Это возможно, с ограничениями. Вы можете обойти механизм UploadUrl, создав blobs непосредственно в вашем сервлете, используя (в настоящее время экспериментальный) createNewBlobFile API. В вашем мобильном приложении (-ах) создайте HTTP-запрос, закодированный как multipart/form-data, и научите ваш сервлет, как его декодировать (например, как загрузить файлы в JSP/Servlet?). Имейте в виду, что HTTP-запросы ограничены 32 МБ; с кодировкой формы количество двоичных данных, которые вы можете загрузить, будет меньше этого.
Конечно, вы можете сделать это с помощью одного POST. Например, у вас есть идентификатор пользователя. Этот пользователь выбирает изображение, и вы отправляете данные изображения POST и пользовательские данные на стороне клиента.
На стороне сервера (GAE) у вас есть url для расширения изображения (ваш_host/imageUpload) и сервера или контроллера Spring, которые считывают данные из запроса и записывают его в Blobstore.