0

私は 3 日間 Google アプリ エンジンに取り組んできましたが、最終的に解決できないこの問題に遭遇しました。多くの調査を行いましたが、説得力のあるものを見つけることができました。M

Google app Engine アカウントを設定した後、アプリケーションの URL "my-app-id.appspot.com/myservlet" を呼び出すと、GAE の単純なサーブレットが Google バケットに .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);

アップロードサーブレット.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を使用して大きなファイルをアップロードするか、

b. メソッドを使用し、アップロードをデコードして解析し、サーブレットで自分でブロブストアに書き込みます (ファイルは 32MB 未満である必要があります)。

c. Google Cloud Storage APIを使用して GCS に直接書き込み、アップロードしたファイル名をアプリにポストします。

于 2012-12-29T01:08:31.830 に答える