blobStoreService.serve () не предоставляет файл загрузки

У меня есть сервлет, в котором я сначала загружаю PDF-файл с http://www.cbwe.gov.in/htmleditor1/pdf/sample.pdf загрузите его содержимое в мое хранилище больших двоичных объектов, и когда пользователь отправит запрос на получение в браузере, в браузере будет загружен большой двоичный объект, но вместо загрузки он показывает данные в некоторых другой формат. Вот мой код сервлета:

package org.ritesh;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.ByteBuffer;

import javax.servlet.http.*;

import org.apache.commons.io.IOUtils;

import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.blobstore.BlobstoreService;
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;
import com.google.appengine.api.files.AppEngineFile;
import com.google.appengine.api.files.FileServiceFactory;
import com.google.appengine.api.files.FileService;
import com.google.appengine.api.files.FileWriteChannel;

@SuppressWarnings("serial")
public class BlobURLServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        resp.setContentType("text/plain");
        resp.getWriter().println("Hello, world");

         FileService fileService = FileServiceFactory.getFileService();

          // Create a new Blob file with mime-type "text/plain"

          String url="http://www.cbwe.gov.in/htmleditor1/pdf/sample.pdf";
          URL url1=new URL(url);
          HttpURLConnection conn=(HttpURLConnection) url1.openConnection();
          String content_type=conn.getContentType();
          InputStream stream =conn.getInputStream();
          AppEngineFile file = fileService.createNewBlobFile("application/pdf");
          file=new AppEngineFile(file.getFullPath());
         Boolean lock = true;
          FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);

          // This time we write to the channel directly
          String s1="";
          String s2="";

          byte[] bytes = IOUtils.toByteArray(stream);


          writeChannel.write(ByteBuffer.wrap(bytes));
          writeChannel.closeFinally();
          BlobKey blobKey = fileService.getBlobKey(file);
          BlobstoreService blobStoreService = BlobstoreServiceFactory.getBlobstoreService();
          blobStoreService.serve(blobKey, resp);


    }
}

Я развертываю этот сервлет на onemoredemo1.appspot.com. Откройте этот URL-адрес и обратите внимание, когда вы нажимаете на сервлет BlobURL, он показывает контент, а не диалог загрузки. Какую модификацию я должен сделать в своем коде, чтобы он отображал диалог загрузки в браузере?


person Ritesh Mehandiratta    schedule 11.08.2012    source источник


Ответы (1)


Смотри сюда:

resp.setContentType("text/plain");

Вы сказали, что контент представляет собой обычный текст, хотя это не так. Вам необходимо установить заголовок Content-Disposition как вложение и установить тип содержимого application/pdf.

Кроме того, если вы собираетесь обслуживать двоичный контент, вам не следует также использовать средство записи (с помощью которого вы пишете "Hello, world").

Если вы измените свою первую пару строк на:

resp.setContentType("application/pdf");
resp.setHeader("Content-Disposition", "attachment;filename=sample.pdf");

вы можете обнаружить, что это все, что требуется.

person Jon Skeet    schedule 11.08.2012