program tip

Google App Engine (Java)을 사용하여 이미지를 업로드하고 저장하는 방법

radiobox 2020. 11. 5. 07:53
반응형

Google App Engine (Java)을 사용하여 이미지를 업로드하고 저장하는 방법


이미지 (파일)를 GAE (java)에 업로드하고 저장하는 가장 간단한 방법을 찾고 있습니다. 간단하고 명확한 결과없이 몇 시간 동안 인터넷 검색 ... : (

이 링크를 찾았습니다 .

하지만 여전히 이미지를 저장하는 방법과 이미지를 검색하는 방법을 모르겠습니다. 간단한 서블릿 예제를 찾고 있습니다.


제공된 링크 "내 앱에 대한 파일 업로드를 어떻게 처리합니까?" 이미지를 업로드하는 방법을 설명합니다.

이미지를 호스팅하려면 Datastore 서비스 를 사용하여 다른 데이터와 함께 이미지를 저장하고 제공해야합니다.

다음은 샘플 코드입니다. 자신의 엔티티 (ig 비즈니스, 사용자 등)가 이미지 필드를 갖도록하는 방법은 스케치로 의미합니다. 코드를 단순화하기 위해 모든 오류 처리 및 복구를 무시했습니다.

이미지로 엔티티 선언. 태그, 위치 등과 같은 다른 필드가 있다고 상상할 수 있습니다.

@Entity
public class MyImage {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String name;

    @Persistent
    Blob image;

    public MyImage() { }
    public MyImage(String name, Blob image) {
        this.name = name; 
        this.image = image;
    }

    // JPA getters and setters and empty contructor
    // ...
    public Blob getImage()              { return image; }
    public void setImage(Blob image)    { this.image = image; }
}

그런 다음 이미지 수신을 시작할 때 (일반적인 파일 업로드 실패 외에도 동일한 이름의 이미지가 이미 업로드 된 경우주의하십시오). ServletFileUpload그리고 IOUtils아파치 커먼즈 라이브러리의 일부 클래스는.

// Your upload handle would look like
public void doPost(HttpServletRequest req, HttpServletResponse res) {
    // Get the image representation
    ServletFileUpload upload = new ServletFileUpload();
    FileItemIterator iter = upload.getItemIterator(req);
    FileItemStream imageItem = iter.next();
    InputStream imgStream = imageItem.openStream();

    // construct our entity objects
    Blob imageBlob = new Blob(IOUtils.toByteArray(imgStream));
    MyImage myImage = new MyImage(imageItem.getName(), imageBlob);

    // persist image
    PersistenceManager pm = PMF.get().getPersistenceManager();
    pm.makePersistent(myImage);
    pm.close();

    // respond to query
    res.setContentType("text/plain");
    res.getOutputStream().write("OK!".getBytes());
}

마지막으로 이름이 지정된 이미지를 제공하려는 경우 :

Blob imageFor(String name, HttpServletResponse res) {
    // find desired image
    PersistenceManager pm = PMF.get().getPersistenceManager();
    Query query = pm.newQuery("select from MyImage " +
        "where name = nameParam " +
        "parameters String nameParam");
    List<MyImage> results = (List<MyImage>)query.execute(name);
    Blob image = results.iterator().next().getImage();

    // serve the first image
    res.setContentType("image/jpeg");
    res.getOutputStream().write(image.getBytes());
}

blobstore API를 사용합니다 .

The Blobstore API allows your application to serve data objects, called blobs, that are much larger than the size allowed for objects in the Datastore service. Blobs are useful for serving large files, such as video or image files, and for allowing users to upload large data files. Blobs are created by uploading a file through an HTTP request. Typically, your applications will do this by presenting a form with a file upload field to the user. When the form is submitted, the Blobstore creates a blob from the file's contents and returns an opaque reference to the blob, called a blob key, which you can later use to serve the blob. The application can serve the complete blob value in response to a user request, or it can read the value directly using a streaming file-like interface...


Easiest way to use Google App Engine Blob Store serving URL (you save instance time)

import com.google.appengine.api.files.FileService;
import com.google.appengine.api.files.AppEngineFile;
import com.google.appengine.api.files.FileWriteChannel;
import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.images.ImagesServiceFactory;
import com.google.appengine.api.images.ServingUrlOptions;
...


// your data in byte[] format
byte[] data = image.getData();
/**
 *  MIME Type for
 *  JPG use "image/jpeg" for PNG use "image/png"
 *  PDF use "application/pdf"
 *  see more: https://en.wikipedia.org/wiki/Internet_media_type
 */
String mimeType = "image/jpeg";

// save data to Google App Engine Blobstore 
FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.createNewBlobFile(mimeType); 
FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
writeChannel.write(java.nio.ByteBuffer.wrap(data));
writeChannel.closeFinally();

// your blobKey to your data in Google App Engine BlobStore
BlobKey blobKey = fileService.getBlobKey(file);

// THANKS TO BLOBKEY YOU CAN GET FOR EXAMPLE SERVING URL FOR IMAGES

// Get the image serving URL (in https:// format)
String imageUrl =
  ImagesServiceFactory.getImagesService().getServingUrl(
    ServingUrlOptions.Builder.withBlobKey(blobKey
          ).secureUrl(true));

참고URL : https://stackoverflow.com/questions/1513603/how-to-upload-and-store-an-image-with-google-app-engine-java

반응형