2012-11-20 18 views
11

का उपयोग कर बाइनरी फ़ाइल को अपलोड करने के लिए कैसे करें किसी URL पर बाइनरी फ़ाइल अपलोड करने के लिए, मुझे this guide का उपयोग करने की सलाह दी गई है। हालांकि, फ़ाइल निर्देशिका में नहीं है, लेकिन MySQL डीबी में एक BLOB फ़ील्ड में संग्रहीत है। ब्लॉब क्षेत्र जेपीए में एक byte[] संपत्ति के रूप में मैप किया गया है:URLConnection

byte[] binaryFile; 

मैं थोड़ा कोड गाइड से लिया संशोधित किया है इस तरह से,:

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); 
// set some connection properties 
OutputStream output = connection.getOutputStream(); 
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, CHARSET), true); 
// set some headers with writer 
InputStream file = new ByteArrayInputStream(myEntity.getBinaryFile()); 
System.out.println("Size: " + file.available()); 
try { 
    byte[] buffer = new byte[4096]; 
    int length; 
    while ((length = file.read(buffer)) > 0) { 
     output.write(buffer, 0, length); 
    } 
    output.flush(); 
    writer.append(CRLF).flush(); 
    writer.append("--" + boundary + "--").append(CRLF).flush(); 
} 
// catch and close streams 

मैं chunked स्ट्रीमिंग का उपयोग नहीं कर रहा। उपयोग किए गए हेडर हैं:

username and password 
Content-Disposition: form-data; name=\"file\"; filename=\"myFileName\"\r\nContent-Type: application/octet-stream" 
Content-Transfer-Encoding: binary 

मेजबान द्वारा सभी शीर्षलेख सही ढंग से प्राप्त किए जाते हैं। यह अपलोड की गई फ़ाइल भी प्राप्त करता है, लेकिन दुर्भाग्यवश शिकायत करता है कि फ़ाइल पठनीय नहीं है, और दावा करती है कि प्राप्त फ़ाइल का आकार मेरे कोड द्वारा आउटपुट आकार से 37 बाइट बड़ा है।

स्ट्रीम, कनेक्शन और बाइट [] का मेरा ज्ञान इसको ठीक करने के तरीके को समझने के लिए बहुत सीमित है। किसी भी संकेत की सराहना की।


संपादित

टिप्पणीकार ने सुझाव दिया है, मैं भी कोशिश की है बाइट [] सीधे लिखने के लिए, ByteArrayInputStream का उपयोग किए बिना:

output.write(myEntity.getBinaryFile()); 

दुर्भाग्य से मेजबान बिल्कुल वैसा ही जवाब देता है दूसरी तरफ के रूप में।

+0

आप बीएआईएस के माध्यम से फाइल स्ट्रीम क्यों कर रहे हैं? क्यों न केवल बाइट सरणी से सीधे लिखें? –

+0

@JimGarrison संकेत के लिए धन्यवाद, मैंने अपना प्रश्न – perissf

+0

अपडेट किया है यदि 'file.available()' के उपयोग के बजाय यदि आप 'byte [] temp = myEntity.getBinaryFile(); 'और' temp.length' का उपयोग करते हैं तो क्या होता है? मुझे संदेह है कि 'file.available() 'बंद है। –

उत्तर

5

मेरा कोड सही था।

होस्ट एक त्रुटि दे रहा था क्योंकि यह Content-Transfer-Encoding शीर्षलेख की अपेक्षा नहीं करता था। इसे हटाने के बाद, सब ठीक हो गया।