0

自 3 天以来,我一直在研究 Google 应用引擎,最后遇到了这个我无法解决的问题。做了很多研究,但可以找到任何令人信服的东西。米

设置我的 Google app Engine 帐户后,当我调用我的应用程序 url "my-app-id.appspot.com/myservlet" 时,GAE 上的简单 Servlet 能够在我的 Google bucket 中写入 .txt 文件。相同的代码片段在这里:

 fetchurl.java 

             DefaultHttpClient hc=new DefaultHttpClient();
             ResponseHandler <String> res=new BasicResponseHandler();
             HttpGet postMethod=new HttpGet("http://my-app-id.appspot.com/uploadservlet");

             String response=hc.execute(postMethod,res);

上传servlet.java

  An example @ Complete Sample App at this link:
  https://developers.google.com/appengine/docs/java/googlestorage/overview

现在我的问题是当我使用 multi-part 通过 POST 方法发送一些文件时,Servlet @ app 引擎不起作用,并且我在 eclipse 中收到错误消息“Filenotfound”。

Android端的.java文件

  urlString = "http://my-app-id.appspot.com/uploadservlet";
  URL url = new URL(urlString);

             // Open a HTTP connection to the URL
             conn = (HttpURLConnection) url.openConnection();
             conn.setConnectTimeout(90000);

             // Allow Inputs
             conn.setDoInput(true);

             // Allow Outputs
             conn.setDoOutput(true);

             // Don't use a cached copy.
             conn.setUseCaches(false);

             // Use a post method.
             conn.setRequestMethod("POST");

             isOK = true;

             conn.setRequestProperty("Connection", "Keep-Alive");

             conn.setRequestProperty("Content-Type",
                     "multipart/form-data;boundary=" + boundary);

             DataOutputStream dos = new DataOutputStream(conn.getOutputStream());


            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=param1;filename="
                            + param1 + "" + lineEnd);
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            Log.e(Tag, "Param1 are written");

            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=param2;filename="
                            + param2 + "" + lineEnd);
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            Log.e(Tag, "Param2 are written");



            FileInputStream fileInputStream = new FileInputStream(new File(
                    path));
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=uploadedfile;filename="
                         + path + "" + lineEnd);
            dos.writeBytes(lineEnd);

            Log.e(Tag, "Headers are written");

             // create a buffer of maximum size

             int bytesAvailable = fileInputStream.available();
             int maxBufferSize = 1000;
             // int bufferSize = Math.min(bytesAvailable, maxBufferSize);
             byte[] buffer = new byte[bytesAvailable];

             // read file and write it into form...

             int bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);

             while (bytesRead > 0) 
             {
                 dos.write(buffer, 0, bytesAvailable);
                 bytesAvailable = fileInputStream.available();
                 bytesAvailable = Math.min(bytesAvailable, maxBufferSize);
                 bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);
             }

             // send multipart form data necesssary after file data...
             //dos.writeBytes(lineEnd);
             dos.writeBytes(twoHyphens + boundary + lineEnd);
             dos.writeBytes(lineEnd);
             dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

我想知道这种方法是否正确。如果不是其他解决方案..我也查看了blobstorage,但它也是一样的,将文件写入存储桶而不是上传..请帮助我......任何事情都会很棒和感激!!!

 Servlet code to handle file upload and save to Google storage--

 @MultipartConfig   
 @SuppressWarnings("serial")
   public class SecondtrygoogleServlet extends HttpServlet 
   {
public static String BUCKETNAME = "androidbucket";
public static String FILENAME = "shikhatry.txt";

private static final long serialVersionUID = 1L;


private static final int THRESHOLD_SIZE = 1024 * 1024 * 3; // 3MB
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
private static final int REQUEST_SIZE = 1024 * 1024 * 50; // 50MB



public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException 
{
    // checks if the request actually contains upload file
    if (!ServletFileUpload.isMultipartContent(request)) {
        // if not, we stop here
        return;
    }

    response.setContentType("text/plain");
    response.getWriter().println("Hello, test1 world");

    // configures some settings
    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setSizeThreshold(THRESHOLD_SIZE);
    factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setFileSizeMax(MAX_FILE_SIZE);
    upload.setSizeMax(REQUEST_SIZE);
    java.io.PrintWriter out = response.getWriter( );

    try {
            // parses the request's content to extract file data
            List<?> formItems = upload.parseRequest(request);
            out.println("Number of fields: " + formItems.size());
            Iterator<?> iter = formItems.iterator();


            // iterates over form's fields
            while (iter.hasNext()) 
            {
                out.println("Inside while loop");
                FileItem item = (FileItem) iter.next();
                // processes only fields that are not form fields
                if (!item.isFormField()) 
                {

                    String temp = item.getFieldName();
                    out.println("Parameter Name"+temp);

                    if(temp.equals("uploadedfile"))
                    {
                        String fileName = new File(item.getName()).getName();
                        FILENAME = fileName+".txt";
                        out.println("Filename"+fileName);


                        FileService fileService = FileServiceFactory.getFileService();
                        GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder()
                        .setBucket(BUCKETNAME)
                        .setKey(FILENAME)
                        .setMimeType("text/html") //audio/mp3 text/html
                        .setAcl("public_read")
                        .addUserMetadata("myfield1", "my field value");


                     AppEngineFile writableFile =
                         fileService.createNewGSFile(optionsBuilder.build());

                     // Open a channel to write to it
                     boolean lock = false;
                     FileWriteChannel writeChannel =
                         fileService.openWriteChannel(writableFile, lock);


                     // Different standard Java ways of writing to the channel
                     // are possible. Here we use a PrintWriter:

                     InputStream inputStream = item.getInputStream();
                     int readBytes = 0;
                     byte[] buffer = new byte[10000];



                     while ((readBytes = inputStream.read(buffer, 0, 10000)) != -1) 
                     {
                        writeChannel.write(ByteBuffer.wrap(buffer));

                     }

                     inputStream.close();

                     writeChannel.closeFinally();
                     response.getWriter().println("Done writing...");

                }
                else if(temp.equals("param1"))
                {
                    out.println("Inside param1");
                    //String param1Val = new File(item.getName()).getName();                        
                    //BUCKETNAME = param1Val;
                }
                else if(temp.equals("param2"))
                {
                    out.println("Inside param2");
                    //String param2Val = new File(item.getName()).getName();

                    //BUCKETNAME = param2Val;


                }
            }
        }
        request.setAttribute("message", "Upload has been done successfully!");
    } catch (Exception ex) {
        request.setAttribute("message", "There was an error: " + ex.getMessage());
    }


}
4

1 回答 1

1

选项是:

一种。使用带有表单的createUploadURL来上传大文件,或者

湾。使用您的方法,然后在 servlet 中自己解码解析上传并写入 blobstore(文件需要小于 32MB),或者

C。使用Google Cloud Storage API直接写入 GCS,然后将上传的文件名发布到您的应用程序。

于 2012-12-29T01:08:31.830 回答