Java 将文件从小程序上载到servlet时出现问题
我正在开发一个小程序,它记录语音并上传到servletJava 将文件从小程序上载到servlet时出现问题,java,servlets,file-upload,browser,applet,Java,Servlets,File Upload,Browser,Applet,我正在开发一个小程序,它记录语音并上传到servlet protected void doPost( ... response.setContentType("your type "); // example: image/jpeg, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/octet-stream respons
protected void doPost(
...
response.setContentType("your type "); // example: image/jpeg, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/octet-stream
response.setHeader("Content-Disposition","attachment; filename=\"your_filename\"");
File uploadedFile = new File("/your_file_folde/your_file_name");
if (uploadedFile.exists()){
FileUtils.copyFile(uploadedFile, response.getOutputStream());
}
else { // Error message
}
....
}
以下是小程序中上载线程的代码
class uploadThread extends Thread {
@Override
public void run() {
try {
//Preparing the file to send
AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
File file = File.createTempFile("uploded", ".wav");
byte audio[] = out.toByteArray();
InputStream input = new ByteArrayInputStream(audio);
final AudioFormat format = getFormat();
final AudioInputStream ais = new AudioInputStream(input, format, audio.length / format.getFrameSize());
AudioSystem.write(ais, fileType, file);
//uploading to servlet
FileInputStream in = new FileInputStream(fileToSend);
byte[] buf = new byte[1024];
int bytesread = 0;
String toservlet = "http://localhost:8080/Servlet/upload";
URL servleturl = new URL(toservlet);
URLConnection servletconnection = servleturl.openConnection();
servletconnection.setDoInput(true);
servletconnection.setDoOutput(true);
servletconnection.setUseCaches(false);
servletconnection.setDefaultUseCaches(false);
DataOutputStream out = new DataOutputStream(servletconnection.getOutputStream());
while ((bytesread = in.read(buf)) > -1) {
out.write(buf, 0, bytesread);
}
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
System.err.println("Error during upload");
}
}
}//End of inner class uploadThread
以下是servlet中的grab file方法的代码:
java.io.DataInputStream dis = null;
try {
int fileLength = Integer.valueOf(request.getParameter("fileLength"));
String fileName = request.getParameter("fileName");
dis = new java.io.DataInputStream(request.getInputStream());
byte[] buffer = new byte[fileLength];
dis.readFully(buffer);
dis.close();
File cibleServeur = new File("/Users/nebrass/Desktop/" + fileName);
FileOutputStream fos = new FileOutputStream(cibleServeur);
fos.write(buffer);
fos.close();
} catch (IOException ex) {
Logger.getLogger(UploadServlet.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
dis.close();
} catch (Exception ex) {
Logger.getLogger(UploadServlet.class.getName()).log(Level.SEVERE, null, ex);
}
}
我已经用keytool创建了一个证书。我已经在applet的JAR上签名了。
我已经将小程序添加到jsp文件中,它正在工作,并且拥有所有权限(我尝试使用小程序在桌面上保存文件)更新:问题是文件没有发送,当我尝试调试servlet时,小程序没有调用它。
请提供帮助是否要将文件从服务器上传到用户桌面 出于明显的安全原因,我怀疑这是否会被允许 为什么不直接从浏览器调用servlet呢?和“另存为”文件 下面是一个如何从servlet发送文件(任何类型)的示例
protected void doPost(
...
response.setContentType("your type "); // example: image/jpeg, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/octet-stream
response.setHeader("Content-Disposition","attachment; filename=\"your_filename\"");
File uploadedFile = new File("/your_file_folde/your_file_name");
if (uploadedFile.exists()){
FileUtils.copyFile(uploadedFile, response.getOutputStream());
}
else { // Error message
}
....
}
这不是它的工作原理。您刚刚打开了一个
URLConnection
,并写入了输出流。通过这种方式,您可以假设类似于套接字连接,但这里我们需要更多的HttpUrlConnection
,然后是请求参数和多部分请求
谷歌找到了很多解决方案,但为了答案的完整性,我在下面添加了一个:
上传是从小程序到servlet的。磁盘上保存是小程序的另一种方法,它工作得很好(相关:Happy 4 figure rep.:)