2009-10-03 22 views
69

के साथ एक छवि को अपलोड और स्टोर कैसे करें मैं GAE (जावा) में छवि (फ़ाइल) को अपलोड और स्टोर करने का सबसे आसान तरीका ढूंढ रहा हूं। किसी भी सरल और स्पष्ट परिणाम के बिना घंटे के लिए Googling ...: (Google ऐप इंजन (जावा)

मिले this link

लेकिन मैं अभी भी कैसे एक छवि को स्टोर करने के लिए, और कैसे इसे पुनः प्राप्त करने नहीं पता ... मैं कर रहा हूँ। सरल सर्वलेट exmample की तलाश में ...

उत्तर

96

लिंक आपके प्रदान की "How do I handle file uploads to my app?" बताते हैं आप चित्र अपलोड कर सकते हैं कैसे।

छवियों की मेजबानी करने के लिए, आप अपने डेटा के साथ की दुकान और छवि की सेवा के लिए Datastore service उपयोग करने की आवश्यकता

यहां एक नमूना कोड है। यह एक स्केच के रूप में है, क्योंकि आप अपनी खुद की इकाई कैसे प्राप्त कर सकते हैं (i.g. व्यवसाय, उपयोगकर्ता, आदि) में एक छवि के लिए एक फ़ील्ड है। कोड को सरल बनाने के लिए मैंने सभी त्रुटि प्रबंधन और पुनर्प्राप्ति को अनदेखा कर दिया।

अपनी इकाई को छवि के साथ घोषित करना। आप कल्पना कर सकते हैं कि अन्य फ़ील्ड, उदा। टैग, स्थान, आदि

@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()); 
} 
+0

इस स्पष्ट और समझदार उत्तर के लिए आपको बहुत बहुत धन्यवाद !!! :) – OXMO456

+0

अद्भुत, धन्यवाद। क्या आप मुझे बता सकते हैं कि बाइट सरणी उचित आउटपुट क्यों नहीं देगी, हालांकि इसे संग्रहीत किया जा रहा है आदि, मैंने कुछ समय पहले इस सवाल को देखा था http://stackoverflow.com/questions/2018597/cannot-fetch-image-data-in- gwt-google-datastore-image-is-strected-out – dhaval

+0

उत्कृष्ट उत्तर! –

10

उपयोग blobstore API:

Blobstore एपीआई डेटा वस्तुओं की सेवा के लिए आपके आवेदन की अनुमति देता है, बुलाया ब्लब्स, जो डाटास्टोर सेवा में ऑब्जेक्ट्स के लिए अनुमति के आकार से काफी बड़ा है। ब्लॉब्स वीडियो या छवि फ़ाइलों जैसे बड़ी फ़ाइलों की सेवा के लिए उपयोगी हैं, और उपयोगकर्ताओं को बड़ी डेटा फ़ाइलों को अपलोड करने की अनुमति देने के लिए उपयोगी हैं। HTTP अनुरोध के माध्यम से फ़ाइल अपलोड करके ब्लब्स बनाए जाते हैं। आम तौर पर, आपके एप्लिकेशन उपयोगकर्ता को फ़ाइल अपलोड फ़ील्ड के साथ एक फॉर्म पेश करके ऐसा करेंगे। जब फॉर्म सबमिट किया जाता है, तो ब्लॉबस्टोर फ़ाइल की सामग्री से एक ब्लॉब बनाता है और ब्लॉब के लिए एक अपारदर्शी संदर्भ देता है, जिसे ब्लॉब कुंजी कहा जाता है, जिसे आप बाद में ब्लॉब की सेवा के लिए उपयोग कर सकते हैं। एप्लिकेशन किसी उपयोगकर्ता अनुरोध के जवाब में पूर्ण ब्लॉब मान प्रदान कर सकता है, या यह सीधे स्ट्रीमिंग फ़ाइल-जैसे इंटरफ़ेस का उपयोग करके मान को पढ़ सकता है ...

+3

इसके लिए आपके आवेदन में बिलिंग सक्षम करने की आवश्यकता है। –

+1

@ लुका-मैटिसिस यहां http://groups.google.com/group/gaelyk/browse_thread/thread/7982f33b5093a162 – jontro

+0

@LucaMatteis हाय के लिए एक काम है, क्या यह सच है? अगर मैं मुफ्त डिफ़ॉल्ट कोटा में उपयोग करता हूं, तो क्या मुझे अभी भी बिलिंग सक्षम करने की आवश्यकता है? – GMsoF

5

Google App Engine Blob Store सेवा URL का उपयोग करने का सबसे आसान तरीका (आप आवृत्ति समय बचाते हैं)

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)); 
+1

चेतावनी! उपरोक्त कोड बहिष्कृत है। –

+1

उपरोक्त कोड के रूप में कोई विकल्प बहिष्कृत है? –

+0

मेरा मानना ​​है कि छवियों की सेवा करने का नया तरीका क्लाउड स्टोरेज के साथ होगा: https://cloud.google.com/python/getting-started/using-cloud-storage –