Relatará exceção de estouro de pilha quando estes dias fazer um projeto problemas encontrados com o cliente java swing para o servidor fazer os arquivos de transferência de massa, a transferência ascendeu a 200M. Código é a seguinte:
byte [] Content = null;
o try {
FIN = new new FileInputStream (File);
ByteArrayOutputStream OUT = new new ByteArrayOutputStream ();
byte [] TEMP = new new byte [1024];
int size = 0;
o while ((size = FIN .read (TEMP)) = -1) {!
out.write (TEMP, 0, tamanho);
}
fin.close ();
conteúdo = out.toByteArray ();
} a captura (excepção E) {
e.printStackTrace () ;
}
Upload em massa é um round-robin para uma matriz de conteúdo para cada fluxo de arquivos enviados para o servidor, o nome do arquivo também é enviada para o servidor, e, em seguida, uma série de conteúdo escrito para o arquivo. Esta abordagem Ben colapso na máquina virtual arquivos maiores quantidade de java.
Minha solução é fazer o upload http método, ainda está fazendo um loop, como segue :( Clique no botão Upload na interface swing, faça o seguinte esta discussão)
Privado Cordas ServerAddress;
Static String privado HTTPHEAD = "http: //";
Static String privado HTTPTAIL = ": 8080 / WMS // ReceiveUploadFile";
Cordas uploadedfilesforlog privada = ""; // carregar o nome do arquivo de log para a preservação log
carregamento Runnable = new Runnable () {
public void run () {
Arquivo [] arquivos = fileChooser.getSelectedFiles ();
if (files.length> 50) {
JOptionPane.showMessageDialog (uploadFileDialog.this, "o número de upload de arquivos não pode ser superior a 50");
uploadButton.setEnabled (true);
Retorna;
}
StringBuffer uploadedfiles = novo StringBuffer ();
if (== null arquivos || files.length == 0) {
JOptionPane.showMessageDialog (uploadFileDialog.this, "você não selecionar arquivos de voz, selecione o arquivo de áudio carregado.");
uploadButton.setEnabled (true);
Retorna;
}
serveraddress = dsclient.getServerAddrss ();
para (int i = 0; i <files.length; i ++) {
Cordas TargetURL = null; // TODO 指定 URL
Arquivo targetfile = null; // TODO especificado de upload de arquivos
targetfile = arquivos [i];
TargetURL = HTTPHEAD + serveraddress + HTTPTAIL; // servleturl
PostMethod filePost = novo PostMethod (TargetURL);
//filePost.getParams().setContentCharset("utf-8" );
logger.info (filePost.getParams () getContentCharset ().);
experimentar {
// parâmetros de página pode ser simulada pelo método a seguir para enviar
Parte [] = {partes novo FilePart (targetFile.getName (), TargetFile)};
filePost.setRequestEntity (novo MultipartRequestEntity (partes,filePost.getParams ()));
HttpClient client = new HttpClient ();
client.getHttpConnectionManager () getParams () setConnectionTimeout (5000)..;
int status = client.executeMethod (filePost);
se (status == HttpStatus.SC_OK) {
if (saveAudioFileToDatabase (arquivos [i]). equals ( "carregamento falhou")) {
continuar;
}
uploadedfilesforlog + = uploadedfilesforlog.equals ( "")? arquivos [i] .getName (): "" + arquivos [i] .getName ();
SaveLog ( "sucesso");
logger.info (arquivos [i] .getName () + "upload bem-sucedido");
uploadedfiles.append ( "[");
uploadedfiles.append (arquivos [i] .getName ());
uploadedfiles.append ( "]");
if ((i + 1)% 5 == 0) {
uploadedfiles.append ( "<BR>");
}
} outro {
logger.info ( "carregamento falhou");
// carregamento falhou
}
} Catch (excepção ex) {
ex.printStackTrace ();
} finalmente {
filePost.releaseConnection ();
}
}
if (uploadedfiles.length () == 0) {
Retorna;
}
uploadButton.setEnabled (true);
ponta String = "<html> arquivo de voz <font color = 'vermelho'> <b>"+ Uploadedfiles.toString () + "</ b> </ font> upload bem-sucedido </ html>!";
JOptionPane.showMessageDialog (uploadFileDialog.this, ponta);
uploadFileDialog.this.setVisible (falso);
uploadFileDialog.this.dispose ();
audioFileManagement.loadList ();
}
};
服务器短接受代码:
importação java.io.File;
importação Java.io.IOException;
importação java.io.PrintStream;
importação java.util.Iterator;
importação java.util.List;
importação javax.servlet.ServletException;
importação javax.servlet.http.HttpServlet;
importação javax.servlet.http.HttpServletRequest;
importação javax.servlet.http.HttpServletResponse;
importação org.apache.commons.fileupload.FileItem;
importação org.apache.commons.fileupload.disk.DiskFileItemFactory;
importação org.apache.commons.fileupload.servlet.ServletFileUpload;
importação org.apache.log4j.Logger;
classe pública ReceiveUploadFile estende HttpServlet
{
private static final long serialVersionUID = 1L;
Logger logger = Logger.getLogger (ReceiveUploadFile.class);
Cordas uploadPath privada = "/ var / lib / X1000 / sons / audiofile /";
Cordas TempPath privada = "/ var / lib / X1000 / sons / audiofile / tampão /";
TempPathFile arquivo;
o init public void ()
lança ServletException
{
Arquivo uploadFile = new File (this.uploadPath);
if ((uploadFile.exists ())!)
uploadFile.mkdirs ();
Arquivo tempPathFile = new File (this.tempPath);
if ((tempPathFile.exists ())!)
tempPathFile.mkdirs ();
}
Protegido doGet void (HttpServletRequest pedido, HttpServletResponse resposta)
lança ServletException, IOException
{
doPost (pedido, resposta);
}
DoPost public void (HttpServletRequest pedido, HttpServletResponse resposta)
lança ServletException, IOException
{
fábrica DiskFileItemFactory;
tente
{
fábrica = new DiskFileItemFactory ();
factory.setSizeThreshold (4096);
factory.setRepository (this.tempPathFile);
ServletFileUpload upload = new ServletFileUpload (de fábrica);
upload.setSizeMax (41943040L);
Os itens da lista = upload.parseRequest (request);
Repetidor i = items.iterator ();
enquanto (i.hasNext ())
{
FileItem fi = (FileItem) i.next ();
Corda nomeArquivo = fi.getName ();
if (fileName! = null)
{
string filename = new String (fi.getName () getBytes (), "utf-8".);
this.logger.info ( "=======================接收到语音文件的文件名:" + nome de arquivo);
Arquivo Fullfile = new File (filename);
Arquivo savedFile = new File (this.uploadPath, fullFile.getName ());
fi.write (savedFile);
}
}
System.out.print ( "upload sucesso");
}
Catch (exceção e)
{
System.out.println (e.getMessage ());
e.printStackTrace ();
}
}
}
Web.xml
<servlet >
< servlet-name > ReceiveUploadFile </ servlet-name > < display-name > ReceiveUploadFile </ display-name > < description > ReceiveUploadFile </ description > < servlet-class > com.gohigh.centrex.common.ReceiveUploadFile </ servlet-class > < load-on-startup > 4 </ load-on-startup > </ servlet > - <servlet-mapping >
< Servlet-name > ReceiveUploadFile </ servlet-name >
< url-pattern > / ReceiveUploadFile </ url-pattern > </ servlet-mapping >
pacote dependente jar: commons-httpclient-3.1.jar, Commons-FileUpload-1.2.1.jar, Commons-CODEC-1.3.jar,
problemas encontrados: problema do lixo chinês, porque o httpclient 3.1.jar commons-pacote a codificação padrão não é UTF-8, ele é enviado para o servidor de nomes de arquivos do servidor chinês para resolver ilegível. Li um monte de métodos on-line
são definir a codificação, mas eu tentei, ou não, só podemos modificar o código fonte pacote jar. Um frasco de ready-made pacote de transferência UTF-8 de:
http://download.csdn.net/detail/wcbkanaz/3697109 , graças a usuários entusiastas.
Além disso, modificar o código fonte dentro quando o código são codificados no que você quer, de modo a garantir que o servidor pode ser resolvido corretamente.
http://download.csdn.net/detail/yuanxw44/4028099 , este endereço você pode baixar o código-fonte, descompacte os arquivos na cópia diretório pode estar dentro de java, necessidade de contar com dois pacotes diretório src sob o eclipse,
commons-logging.jar e commons-codec.jar, alterou novamente a brincar com fatjar.
commons-httpclient-3.1.jar
commons-fileupload-1.2.1.
commons-fileupload-1.2.1.
commons-codec-1.3.jar