2012-11-20 23 views
11

Bir URL'ye bir ikili dosya yüklemek için, this guide'u kullanmanız önerildi. Ancak, dosya bir dizinde değil, ancak MySql db'deki bir BLOB alanında saklanır. BLOB alan JPA bir byte[] özelliği olarak eşleştirilmiş:URLConnection kullanarak ikili dosyayı yükleme

byte[] binaryFile; 

Biraz bu şekilde, rehber alınan kodunu değiştirmiş: Ben yığın halinde akış kullanmıyorum

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 

. Kullanılan başlıklar şunlardır: Tüm üstbilgiler ana bilgisayar tarafından doğru şekilde alındı. Ayrıca, yüklenen dosyayı da alır, ancak ne yazık ki dosyanın okunamadığından şikayetçi olur ve alınan dosyanın boyutunun kodumun çıkardığı boyuttan 37 bayt daha büyük olduğunu iddia eder.

Akımlar, bağlantılar ve bayt [] hakkındaki bilgim, bunu düzeltmenin yolunu bulmak için çok sınırlıdır. Herhangi bir ipucu takdir edildi.


DÜZENLEME

yorumcu tarafından önerildiği gibi

, ben ByteArrayInputStream kullanmadan, doğrudan byte [] yazmaya da denedim:

output.write(myEntity.getBinaryFile()); 

Maalesef konak tam olarak aynı cevabı verir diğer yol olarak.

+0

Dosyayı neden BAIS üzerinden yayınlıyorsunuz? Neden sadece bayt dizisinin kendisinden doğrudan yazmıyoruz? –

+0

@JimGarrison İpucu için teşekkürler, benim sorumu güncelledim – perissf

+0

'file.available()' kullanmak yerine ne yaparsınız? Byte [] temp = myEntity.getBinaryFile(); 've' temp.length' işlevini kullanın? Dosya.available() 'kapalı olduğundan şüpheleniyorum. –

cevap

5

Kodum doğruydu.

Ev sahibi bir hata veriyordu çünkü Content-Transfer-Encoding başlığını beklemiyordu. Çıkardıktan sonra her şey yolunda gitti.

İlgili konular