POST -> BLOB

5 отговора 144 прегледа
#1

POST -> BLOB

Taka i taka sam zatrupal foruma s vaprosi - shte si pozvolia i oshte edin:
Kak da pisha ot methoda post directno varhu BLOB v bazata danni? Koe da izpolzvam? InputStream ili OutputStream? Iasno e che triabva da polzvam multipart ama po natatak kak sa neshtata?

Predvaritelno blagodaria.

Отговор
в отговор на vladi #2

Re: POST -> BLOB

Сигурно вече си си решил проблема, но все пак. И аз имах такъв проблем. Свалих си UploadBean. В JSP-то го използвам да парсне multipart-а и да си upload-не файловете в паметта, от там - prepStmt.setBytes(i++,buf[]) - ще го видиш как точно става в документацията на UploadBean, елементарно е.
[линк]

Отговор
в отговор на Sten #3

Re: POST -> BLOB

a ako failovete sa 1-2-3-4-5 GB golemi kakwo shte pravish? ;)

Отговор
в отговор на vladi #4

Re: POST -> BLOB

Ako pravish upload ot forma w browser, triabwa da parse-vash multipart document. Procheti syotvetnite RFC-ta (RFC 2388, RFC 2183, RFC 2045, HTML 4.0 spec) kak tochno stava -- ne e slojno, no e dosadno.

Az polzwam class, koito za wseki part wika metod processFile, davaiki InputStream ot koito moje da se chete sydyrjanieto na part-a. Na prepared statement-a s koito update-vash BLOB-a pravish setBinaryStream(...) i executeUpdate.

Ne moga da ti dam source-a na multipart parser-a, shtoto se vodi sobstvenost na firmata za koiato rabotia. triabwashe da se setia da go napisha w svobodnoto si wreme ...

Отговор
в отговор на vladi #5

Re: POST -> BLOB

Tova be moeto reshenie:

public void parseAndUpload ( HttpServletRequest request ) {
this.parseAndUpload( request, 5*1024*1024 ); // 5MB
}

//-----------------------------------------------------------------
public void parseAndUpload(HttpServletRequest request, int _bytes ) {

Part part = null;
MultipartParser mp = null;

ByteArrayOutputStream outArrayStream = null;
ByteArrayInputStream inArrayStream = null;

try {
mp = new MultipartParser(request, _bytes);

while ((part = mp.readNextPart()) != null) {
String name = part.getName();
if (part.isParam()) {
// it's a parameter part
ParamPart paramPart = (ParamPart) part;
String value = paramPart.getStringValue();
System.out.println("param; name=" + name + ", value=" + value);
}
else if (part.isFile()) {
// it's a file part
FilePart filePart = (FilePart) part;
String fileName = filePart.getFileName();
String filePath = filePart.getFilePath();

if (fileName != null ) {

long size;

outArrayStream = new ByteArrayOutputStream();
size = filePart.writeTo(outArrayStream);
byte[] bytes = outArrayStream.toByteArray();
outArrayStream.close();
inArrayStream = new ByteArrayInputStream( bytes);

this.upload(fileName, size, inArrayStream);

}
else { System.out.println("file; name=" + name + "; EMPTY"); }
//outArrayStream.flush();
}
}
}
catch (IOException ioe) { ioe.printStackTrace();
}

}



//-----------------------------------------------------------------
public int upload( String fileName,
long file_size,
InputStream is ) {

int retCode = 0;
int next_val = 0;
java.sql.Date date;

try{

date = new java.sql.Date( new java.util.Date().getTime());
//date = new java.sql.Date( System.currentTimeMilis());

Statement statement = con.createStatement();
ResultSet rs1 = statement.executeQuery("select blob01_seq.nextval from dual");
while(rs1.next()){
next_val = rs1.getInt(1);
}

String sql1 = "begin " + " insert into BLOB01(ID, FILE_NAME, DATE_LOAD,FILE_SIZE, BLOB_CONTENT) "
+ " values("+ next_val +",?,?,?,empty_blob()) "
+ " return blob_content into ?; " + "end;";

OracleCallableStatement ocs1 =
( OracleCallableStatement) con.prepareCall( sql1);

ocs1.setString(1, fileName);
ocs1.setDate(2, date);
ocs1.setLong(3, file_size);
ocs1.registerOutParameter(4, OracleTypes.BLOB);

ocs1.executeUpdate();
BLOB blob = ocs1.getBLOB(4);

OutputStream os = blob.getBinaryOutputStream();

int size = blob.getBufferSize();
byte buffer1[] = new byte[size];

int length;

long wcount = 0;

while( (length = is.read(buffer1, 0, size)) != -1 ){
wcount += length;
os.write(buffer1, 0, length);
}

System.out.println(wcount + " bytes written to BLOB field");

os.flush();

is.close();
os.close();
ocs1.close();
con.commit();

} catch (Exception e) {
retCode = -1;
e.printStackTrace();
} finally {
return retCode;
}
}

Отговор
в отговор на l #6

Re: POST -> BLOB

Можеш да ограничиш размера на download както и броя файлове. Не виждам в случая какво те тормози

Отговор