POST -> BLOB
5 отговора
144 прегледа
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.
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.
Re: POST -> BLOB
Сигурно вече си си решил проблема, но все пак. И аз имах такъв проблем. Свалих си UploadBean. В JSP-то го използвам да парсне multipart-а и да си upload-не файловете в паметта, от там - prepStmt.setBytes(i++,buf[]) - ще го видиш как точно става в документацията на UploadBean, елементарно е.
[линк]
[линк]
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 ...
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 ...
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;
}
}
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;
}
}
Re: POST -> BLOB
Можеш да ограничиш размера на download както и броя файлове. Не виждам в случая какво те тормози