【问题标题】:android asynctask upload file success ( no error) but cant see in serverandroid asynctask上传文件成功(没有错误)但在服务器中看不到
【发布时间】:2016-03-04 17:35:11
【问题描述】:

今天你好,我找到了一种将数据库上传到本地主机的方法。 这是我的 Serverlet

@WebServlet("/UploadDownloadFileServlet")

public class UploadDownloadFileServlet extends HttpServlet {

private static final long serialVersionUID = 1L;
private ServletFileUpload uploader = null;

@Override
public void init() throws ServletException {
    DiskFileItemFactory fileFactory = new DiskFileItemFactory();
    File filesDir = (File) getServletContext().getAttribute(
            "FILES_DIR_FILE");
    fileFactory.setRepository(filesDir);
    this.uploader = new ServletFileUpload(fileFactory);
}

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    String fileName = request.getParameter("fileName");
    if (fileName == null || fileName.equals("")) {
        throw new ServletException("File Name can't be null or empty");
    }
    File file = new File(request.getServletContext().getAttribute(
            "FILES_DIR")
            + File.separator + fileName);
    if (!file.exists()) {
        throw new ServletException("File doesn't exists on server.");
    }
    System.out.println("File location on server::" + file.getAbsolutePath());
    ServletContext ctx = getServletContext();
    InputStream fis = new FileInputStream(file);
    String mimeType = ctx.getMimeType(file.getAbsolutePath());
    response.setContentType(mimeType != null ? mimeType : "application/octet-stream");
    response.setContentLength((int) file.length());
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

    ServletOutputStream os = response.getOutputStream();
    byte[] bufferData = new byte[1024];
    int read = 0;
    while ((read = fis.read(bufferData)) != -1) {
        os.write(bufferData, 0, read);
    }
    os.flush();
    os.close();
    fis.close();
    System.out.println("File downloaded at client successfully");
}

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    if (!ServletFileUpload.isMultipartContent(request)) {
        throw new ServletException(
                "Content type is not multipart/form-data");
    }

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.write("<html><head></head><body>");
    try {
        List<FileItem> fileItemsList = uploader.parseRequest(request);
        Iterator<FileItem> fileItemsIterator = fileItemsList.iterator();
        while (fileItemsIterator.hasNext()) {
            FileItem fileItem = fileItemsIterator.next();
            System.out.println("FieldName=" + fileItem.getFieldName());
            System.out.println("FileName=" + fileItem.getName());
            System.out.println("ContentType=" + fileItem.getContentType());
            System.out.println("Size in bytes=" + fileItem.getSize());

            File file = new File(request.getServletContext().getAttribute(
                    "FILES_DIR")
                    + File.separator + fileItem.getName());
            System.out.println("Absolute Path at server="
                    + file.getAbsolutePath());
            fileItem.write(file);
            }
}

是的,然后我是来自 android 的代码:

class DatabaseAction extends AsyncTask<Void, Integer, Void> {
    SQLiteDatabase db;
    // String link =
    // "http://192.168.56.101:8080/UploadServlet301/upload.jsp";
    String link = "http://192.168.56.101:8080/ServletFileUploadDownloadExample/";
    HttpURLConnection connection = null;
    DataOutputStream outputStream = null;
    DataInputStream inputStream = null;
    URL url;
    String folderPath;
    String arrayOfFiles[];
    File root;
    File allFiles;

    String urlServer = "http://urluploadscriptaddress.php";
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";

    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1 * 1024 * 1024;

    public DatabaseAction(SQLiteDatabase db) {
        this.db = db;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Logger.error("start");
    }

    @Override
    protected Void doInBackground(Void... params) {
        Logger.error("path: " + db.getPath());
        uploadFile(db.getPath());
        return null;
    }

    public long uploadFile(String sourceFileUri) {
        String fileName = sourceFileUri;
        long TotalSize = 0;
        HttpURLConnection comm = null;
        DataOutputStream dos = null;
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        int bytesRead,  bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 10240;
        File sourceFile = new File(sourceFileUri);
        int serverResonseCode;

        if (!sourceFile.isFile()) {
            Log.e("UploadFile", "Source File not Exist: " + sourceFile);

            return 0;
        } else {
            try {
                FileInputStream fis = new FileInputStream(db.getPath());
                URL url = new URL(link);

                comm = (HttpURLConnection) url.openConnection();
                comm.setDoInput(true);
                comm.setDoOutput(true);
                comm.setUseCaches(false);
                comm.setRequestMethod("POST");
                comm.setRequestProperty("Connection", "Keep-Alive");
                comm.setRequestProperty("ENCTYPE", "multipart/form-data");
                comm.setRequestProperty("Content-Type",
                        "multipart/form-data;boundary=" + boundary);
                comm.setRequestProperty("fileName", fileName);
                dos = new DataOutputStream(comm.getOutputStream());
                dos.writeBytes(twoHyphens + boundary + lineEnd);
                dos.writeBytes("Content-Disposition: form-data; name=\"fileName\";filename=\""
                        + fileName + "\"" + lineEnd);
                dos.writeBytes(lineEnd);
                bytesAvailable = fis.available();
                TotalSize = bytesAvailable;
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                buffer = new byte[bufferSize];

                bytesRead = fis.read(buffer, 0, bufferSize);

                while (bytesRead > 0)

                {
                    dos.write(buffer, 0, bufferSize);
                    bytesAvailable = fis.available();
                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    bytesRead = fis.read(buffer, 0, bufferSize);
                    publishProgress(bytesRead);

                }

                dos.writeBytes(lineEnd);
                dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
                serverResonseCode = comm.getResponseCode();

                if (serverResonseCode == 200) {
                    Logger.error("File Upload Completed.");
                }

                fis.close();
                dos.flush();
                dos.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
                Log.e("Upload file to server", "error: " + e.getMessage(),e);
            } catch (Exception e) {
                e.printStackTrace();
                Log.e("Upload file to server", "error: " + e.getMessage(),e);
            }

            return TotalSize;
        }
    }

好的,现在我从网站上传,它返回服务器中文件的位置:

字段名=文件名

文件名=epl-v10.html

ContentType=文本/html

字节大小=16536

服务器的绝对路径=C:\Users\dungdv4\Desktop\Android 我的代码 堆栈\sv tomcat\tmpfiles\epl-v10.html

但在 Eclipse 运行中,它说:

03-04 08:27:48.249: E/###########(2643): 开始

03-04 08:27:48.249: E/###########(2643): 路径: /data/data/com.###########.###########/databases/##########-db

03-04 08:27:48.253:E/###########(2643):文件上传完成。

03-04 08:27:48.253: E/###########(2643): 在此处查看上传的文件: /var/www/上传

03-04 08:27:48.261:E/###########(2643):结果:null

它说文件上传成功,但我在服务器上找不到这个文件

【问题讨论】:

标签: java android file-upload android-asynctask


【解决方案1】:

我找到了解决方案,看来我很惊讶:)

看看

@WebServlet("/UploadDownloadFileServlet") 在 servlet 中。

所以我需要将链接更改为 String link = "192.168.56.101:8080/ServletFileUploadDownloadExample/UploadDownloadFileServlet";

好的,现在它就像魅力一样,谢谢大家

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多